所以我有一个UITableView,其中一行是UITextView。
当用户向UITextView写入内容时(使用键盘),用户可以滚动tableview并选择另一个单元格。一切正常。
当用户选择另一个单元格时,会出现一个datePicker,用户可以选择给定的日期。我希望用户能够像键盘在屏幕上一样滚动tableView。
这里的问题是当我使用选择器滚动时,表会反弹回到前一个位置(选择器隐藏了一些单元格)。
我认为这是因为我将选择器添加到主窗口,作为子视图......但我老实说不确定......
我应该在哪里(以及如何)添加我的选择器,使其“出现”键盘出现的位置?
不确定我是否清楚......
非常感谢。
答案 0 :(得分:11)
您应该使用UIResponder类(也是UITextField类)的inputView属性。 只是做:
UIPickerView *picker = [[UIPickerView alloc] initWithFrame:CGRectZero];
//picker.delegate = self;
//picker.dataSource = self;
//[picker setShowsSelectionIndicator:YES];
textField.inputView = picker;
[picker release];
和UIPickerView的行为类似于键盘视图。
有关详细信息和示例代码,请参阅我的文章working with pickers。
答案 1 :(得分:0)
我实际上是用UIDatePicker做的,创建了我自己的SlideUpDatePicker,它像键盘一样从底部开始动画。我花了一两个星期的时间才能完美地完成所有工作,在纵向和横向以及导航控制器及其动画上工作绝对不容易。
键盘会创建一个新的顶级窗口来保存其视图,并在通知中心出现之前和之后向通知中心发布通知并消失,以便视图控制器可以调整其视图的大小以考虑键盘。视图控制器需要处理这些通知并根据键盘的大小调整tableview的大小。
我的SlideUpDatePicker发布了与键盘相同的通知,因此视图控制器不必修改,并且可以对键盘和上滑日期选择器做出相同的响应。
如果您使用dumpWindows()功能,您可以在基于导航的应用中使用键盘和表格视图查看UIWindow和UIView层次结构:
dumpView: <UIWindow: 0x411fd50; frame = (0 0; 320 480); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x4120af0>>
dumpView: : <UILayoutContainerView: 0x4123310; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x411f800>>
dumpView: : | <UINavigationTransitionView: 0x4123500; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x41232e0>>
dumpView: : | : <UIViewControllerWrapperView: 0x4519d30; frame = (0 64; 320 416); autoresize = W+H; layer = <CALayer: 0x4519a40>>
dumpView: : | : | <UITableView: 0x7808000; frame = (0 0; 320 416); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x45182a0>>
dumpView: : | : | : <DeleteCell: 0x45196e0; baseClass = UITableViewCell; frame = (0 507; 320 45); opaque = NO; autoresize = W; layer = <CALayer: 0x4519a80>>
dumpView: : | : | : <TextCell: 0x4523280; baseClass = UITableViewCell; frame = (0 442; 320 45); autoresize = W; layer = <CALayer: 0x4521ed0>>
dumpView: : | : | : <DatePickerCell: 0x45224b0; baseClass = UITableViewCell; frame = (0 398; 320 44); autoresize = W; layer = <CALayer: 0x451e170>>
dumpView: : | : | : <ButtonCell: 0x4521680; baseClass = UITableViewCell; frame = (0 354; 320 44); autoresize = W; layer = <CALayer: 0x4521750>>
dumpView: : | : | : <ButtonCell: 0x45209f0; baseClass = UITableViewCell; frame = (0 310; 320 44); autoresize = W; layer = <CALayer: 0x4520ac0>>
dumpView: : | : | : <ButtonCell: 0x4520100; baseClass = UITableViewCell; frame = (0 266; 320 44); autoresize = W; layer = <CALayer: 0x45201d0>>
dumpView: : | <UINavigationBar: 0x45018b0; frame = (0 20; 320 44); clipsToBounds = YES; autoresize = W; layer = <CALayer: 0x4500fe0>>
dumpView: : | : <UINavigationItemView: 0x4522a20; frame = (100 8; 160 27); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x4526310>>
dumpView: : | : <UINavigationItemButtonView: 0x45230a0; frame = (5 7; 87 30); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x4520260>>
dumpView: <UITextEffectsWindow: 0x4537080; frame = (0 0; 320 480); opaque = NO; layer = <CALayer: 0x45371c0>>
dumpView: : <UIKeyboard: 0x4536ce0; frame = (0 264; 320 216); opaque = NO; layer = <CALayer: 0x4536f60>>
dumpView: : | <UIKeyboardImpl: 0x4175b10; frame = (0 0; 320 216); opaque = NO; layer = <CALayer: 0x4173f90>>
dumpView: : | : <UIKeyboardLayoutStar: 0x4177d90; frame = (0 0; 320 216); layer = <CALayer: 0x4177610>>
dumpView: : | : | <UIKBKeyplaneView: 0x418a6a0; frame = (0 0; 320 216); userInteractionEnabled = NO; layer = <CALayer: 0x418a750>>
dumpView: : | : | : <UIKBKeyView: 0x41748e0; frame = (1 119; 40 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x41545c0>>
dumpView: : | : | : <UIKBKeyView: 0x417e2d0; frame = (279 119; 40 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x417df10>>
dumpView: : | : | : <UIKBKeyView: 0x418a780; frame = (1 173; 78 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x417f990>>
dumpView: : | : | : <UIKBKeyView: 0x418adf0; frame = (81 173; 158 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x4180120>>
dumpView: : | : | : <UIKBKeyView: 0x418cdb0; frame = (241 173; 78 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x418cf20>>
答案 2 :(得分:0)
不太优雅......
不那么亲......
我这样做了......
CGRect frame3 = self.tableView.frame;
frame3.size.height = frame3.size.height-216;
self.tableView.frame = frame3;
然后我让我的选择器出现了。 Etvoilá! ;)
答案 3 :(得分:0)
正如lechec指出的那样,只需将UITextField的inputView属性设置为UIPickerView即可。这很容易做到。
此博客文章详细介绍了如何执行此操作:http://nomtek.com/tips-for-developers/working-with-pickers/并且包含一个项目,可通过示例代码下载。该项目在XCode 4.2中打开正常,并为iOS 5编译。
另外,我不想放一个按钮来隐藏它。以下代码允许用户点击视图中的任何位置,在UITextField之外,并将其作为第一响应者重新签名,基本上使其“失去焦点”。实际上,处理点击手势的代码会导致任何UITextField“失去焦点”,从而隐藏任何inputView或键盘。
-(void)handleViewTapGesture:(UITapGestureRecognizer *)gesture
{
[self endEditing:YES];
}
这是在ViewController中实现的。处理程序作为手势识别器添加到View属性的setter中的相应View:
-(void) setLoginView:(LoginView *)loginView
{
_loginView = loginView;
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self.loginView action:@selector(handleTapGesture:)];
[tapRecognizer setDelegate:self]; // self implements the UIGestureRecognizerDelegate protocol
[self.loginView addGestureRecognizer:tapRecognizer];
}
处理程序也可以在View中定义。如果您不熟悉处理手势,请参阅Apple的文档和/或其他地方的大量样本。
我应该提一下,你需要一些额外的代码来确保其他控件获得点击,你需要一个实现UIGestureRecognizerDelegate协议的委托和这个方法:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if ([touch.view isKindOfClass:[UIButton class]]) // Customize appropriately.
return NO; // Don't let the custom gestureRecognizer handle the touch
return YES;
}