键盘挡住了输入字段(Keyboard obscures the entry field)

2019-10-16 17:48发布

当我想要把文字变成我的UITextField,键盘显示在它的顶部,并覆盖领域。 如何避免这种情况? 我刚读: 这个解决方案 ,但我不知道在哪里的大小? 这是一个好办法?

我的代码是:

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],...

Answer 1:

你必须通过一些价值实现的UITextField textFieldDidBeginEditing和textFieldDidEndEditing.Move的代表parentview起来的帧时textFieldDidBeginEditing被调用,当委托方法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];

并更改选择的框架: -

- (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; 
} 

同样可以BR做了文本框代表。



Answer 2:

调整大小应该被应用到根视图:这个想法是设置视图帧以匹配可视区域由键盘减少,同时第一响应仍是可见的。 检查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.
}

对于表视图,你不需要改变大小,见keyboardDidAppear实施TTTableViewController

///////////////////////////////////////////////////////////////////////////////////////////////////
- (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];
}


Answer 3:

您应该实现以下方法

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

在执行你应该重新调整文本框框架。 如果你要通过键盘显示以及不是隐藏的,你会想其他的观点,你应该将它们移动过。 它是有帮助的有两个方法调整帧2个职位(1个时,会显示键盘和一个当它是隐藏的,所以一旦文本字段完成编辑您拨打以下文本字段的委托方法的另一种方法:

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

在这两个方法帮助你改变帧位置并更改视图被隐藏与否,它看起来更好,如果你它们的动画,是这样的:

    - (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){
                 }];
     }


Answer 4:

我个人强烈建议使用TPKeyboardAvoiding由迈克尔·泰森。

这是非常容易使用...(从自述引用):

对于具有的UITableViewController类使用降TPKeyboardAvoidingTableView.m和TPKeyboardAvoidingTableView.h到您的项目,并让您的UITableView在厦门国际银行一个TPKeyboardAvoidingTableView。 如果你不使用厦门国际银行与您的控制器,据我所知,没有简单的方法,以使其UITableView的自定义类:阻力最小的路径是建立一个厦门国际银行它。

对于非UITableViewControllers,删除TPKeyboardAvoidingScrollView.m和TPKeyboardAvoidingScrollView.h源文件到您的项目,弹出一个UIScrollView到您的视图控制器的XIB,设置滚动视图对TPKeyboardAvoidingScrollView类,并把那个滚动视图中的所有控件。 您也可以通过编程创建它,而无需使用厦门国际银行 - 只使用TPKeyboardAvoidingScrollView为您的顶级视图。



文章来源: Keyboard obscures the entry field