让我的UIPickerView具有与键盘相同的行为

时间:2010-05-27 16:14:51

标签: iphone uitableview uipickerview

所以我有一个UITableView,其中一行是UITextView。

当用户向UITextView写入内容时(使用键盘),用户可以滚动tableview并选择另一个单元格。一切正常。

当用户选择另一个单元格时,会出现一个datePicker,用户可以选择给定的日期。我希望用户能够像键盘在屏幕上一样滚动tableView。

这里的问题是当我使用选择器滚动时,表会反弹回到前一个位置(选择器隐藏了一些单元格)。

我认为这是因为我将选择器添加到主窗口,作为子视图......但我老实说不确定......

我应该在哪里(以及如何)添加我的选择器,使其“出现”键盘出现的位置?

不确定我是否清楚......

非常感谢。

4 个答案:

答案 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;
}