键盘掩盖了input字段

当我想把文本放入我的UITextField时,键盘显示在它的顶部,并且覆盖这个字段。 如何防止这一点? 我刚刚阅读: 这个解决scheme,但我不知道在哪里调整? 这是一个好方法?

我的代码是:

UITextField * passwordTextField = [[[UITextField alloc] init] autorelease]; passwordTextField.keyboardType = UIKeyboardTypeDefault; passwordTextField.delegate = self; passwordTextField.placeholder = NSLocalizedString(@"somestr", @""); passwordTextField.secureTextEntry = YES; [_controls setObject:passwordTextField forKey:keyPassword]; 

然后我用Three20展示它:

 ...@"", [NSArray arrayWithObjects: [TTTableControlItem itemWithCaption:nil control:passwordTextField], nil],... 

您只需要实现UITextField textFieldDidBeginEditing和textFieldDidEndEditing的委托。当调用textFieldDidBeginEditing时,通过某个值移动parentview的框架,并在调用委托方法textFieldDidEndEditing时将其恢复为相同的值。

另一种方法是为UIKeyboardDidShowNotification添加一个观察器,并在UIKeyboardDidHideNotification触发时向下移动框架。

样本: –

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:)name:UIKeyboardDidShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasHidden:) name:UIKeyboardDidHideNotification object:nil]; 

并更改select器中的帧: –

 - (void)keyboardDidShow:(NSNotification *)aNotification { if ( keyBDidShow) return; NSTimeInterval animationDuration = 0.300000011920929; CGRect frame = self.view.frame; frame.origin.y -= 60; [UIView beginAnimations:@"Rollback" context:nil]; [UIView setAnimationDuration:animationDuration]; self.view.frame = frame; [UIView commitAnimations]; viewUp= YES; } keyBDidShow= YES; } - (void)keyboardWasHidden:(NSNotification *)aNotification { if ( viewUp) { NSTimeInterval animationDuration = 0.300000011920929; CGRect frame = self.view.frame; frame.origin.y += 60; [UIView beginAnimations:@"Rollback" context:nil]; [UIView setAnimationDuration:animationDuration]; self.view.frame = frame; [UIView commitAnimations]; viewUp = NO; } keyBDidShow= NO; } 

同样可以为文本字段代表完成。

resize应该应用到根视图:想法是设置视图框架匹配可见区域通过键盘缩小,而第一响应者仍然可见。 检查TTBaseViewController属性的autoresizesForKeyboard和相应的方法

 /////////////////////////////////////////////////////////////////////////////////////////////////// - (void)keyboardWillAppear:(BOOL)animated withBounds:(CGRect)bounds { // Empty default implementation. } /////////////////////////////////////////////////////////////////////////////////////////////////// - (void)keyboardWillDisappear:(BOOL)animated withBounds:(CGRect)bounds { // Empty default implementation. } /////////////////////////////////////////////////////////////////////////////////////////////////// - (void)keyboardDidAppear:(BOOL)animated withBounds:(CGRect)bounds { // Empty default implementation. } /////////////////////////////////////////////////////////////////////////////////////////////////// - (void)keyboardDidDisappear:(BOOL)animated withBounds:(CGRect)bounds { // Empty default implementation. } 

对于表视图,您不需要更改大小,请参阅TTTableViewControllerkeyboardDidAppear实现

 /////////////////////////////////////////////////////////////////////////////////////////////////// - (void)keyboardDidAppear:(BOOL)animated withBounds:(CGRect)bounds { [super keyboardDidAppear:animated withBounds:bounds]; self.tableView.frame = TTRectContract(self.tableView.frame, 0, bounds.size.height); [self.tableView scrollFirstResponderIntoView]; [self layoutOverlayView]; [self layoutBannerView]; } 

你应该实现以下方法

  - (BOOL) textFieldShouldBeginEditing:(UITextField *)textField{ [self adjustFramesWhenKeyoradIsShown]; } 

在实现中,您应该重新调整文本框架。 如果您还有其他视图需要显示,而不是通过键盘隐藏,则还应该移动它们。 有两种方法可以为两个位置重新调整帧(一个是显示键盘时,另一个是隐藏时),所以一旦文本字段完成编辑,就可以在下面的文本字段委托方法中调用另一个方法:

  - (BOOL)textFieldShouldReturn:(UITextField *)textField { [self adjustFramesWhenKeyoradIsHidden]; } 

在这两种帮助方法中,您可以更改框架位置并将视图更改为隐藏或隐藏,如果您使用它们进行animation处理,它会更好看,如下所示:

  - (void) adjustFramesWhenKeyoradIsShown{ [UIView animateWithDuration:0.3 delay:0.0 options: UIViewAnimationCurveEaseOut animations:^{ logoArea.hidden = YES; loginFieldsArea.frame = CGRectMake(0, 0, 320, 250); } completion:^(BOOL finished){ }]; } 

我个人强烈build议使用Michael Tyson的TPKeyboardAvoiding 。

这很容易使用…(引自Read Me):

为了与UITableViewController类一起使用,将TPKeyboardAvoidingTableView.m和TPKeyboardAvoidingTableView.h拖放到您的项目中,并使您的UITableView成为xib中的TPKeyboardAvoidingTableView。 如果你没有使用你的控制器的xib,我知道没有简单的方法来使它的UITableView成为一个自定义类:阻力最小的path是为它创build一个xib。

对于非UITableViewController ,将TPKeyboardAvoidingScrollView.m和TPKeyboardAvoidingScrollView.h源文件放入您的项目中,将UIScrollViewpopup到视图控制器的xib中,将滚动视图的类设置为TPKeyboardAvoidingScrollView,并将所有控件放在该滚动视图中。 您也可以通过编程的方式来创build它,而不使用xib – 只需使用TPKeyboardAvoidingScrollView作为顶层视图即可。