问题
在前面的文章中有说到键盘的处理方式键盘处理之一,很好用。不过适用的情况是在屏幕底部只有一个输入框的时候。有朋友问到当一个界面有很多个输入框,上面的输入框点击不需要向上移动,只有下面的点击才需要界面上移的时候怎么办?
解决方案
我这里就给出一个解决方案,可能不是最优,希望看到的朋友有更好的方法能够分享给我。
- 首先让你的xxxController继承代理
@interface xxxController()<UITextFieldDelegate>
@end
- 让你希望能够上移的输入框XXXTextField的代理称为控制器本身
self.XXXTextField.delegate = self;
- 让控制器监听键盘消失的通知,为的是让键盘消失的时候也能在需要时调整界面的位置
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyBoardWillHideFrame:) name:UIKeyboardWillHideNotification object:nil];
- 实现UITextField的代理方法和键盘的监听方法
- (void)textFieldDidBeginEditing:(UITextField *)textField{
CGRect frame = self.view.frame;
//这里的50是随便设置的
frame.origin.y -=50;
frame.size.height +=50;
self.view.frame = frame;
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
CGRect frame = self.view.frame;
frame.origin.y +=50;
frame.size.height -=50;
self.view.frame = frame;
[textField resignFirstResponder];
return YES;
}
-(void)keyBoardWillHideFrame:(NSNotification *)notification{
if (self.view.frame.origin.y == -50) {
CGRect frame = self.view.frame;
frame.origin.y +=50;
frame.size.height -=50;
self.view.frame = frame;
}
}
解决方案优化
可以让self成为需要的textfield代理,然后直接实现下面两个方法即可
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
CGRect frame = self.view.frame;
if (frame.origin.y == 0) {
frame.origin.y -= UpHeightFloat;
self.view.frame = frame;
}
}
-(void)textFieldDidEndEditing:(UITextField *)textField
{
CGRect frame = self.view.frame;
if (frame.origin.y < 0) {
frame.origin.y = 0;
}
self.view.frame = frame;
}
解决方法很多,还可以通过绑定tag判断等等。总之会有一种适合你的方法。