处理键盘的时候遇见了这么一种情况,当前页面的UITextField被遮挡,点击按钮会从底部弹出一个透明背景的输入框,这个弹窗里的UITextField也会被键盘遮挡,所以这个类里也增加了键盘通知。
这种情况的的结果就是,当弹窗里的UITextField处于焦点时,背景页面里的事件也会触发,背景页和弹窗页同时都有页面滚动的效果。
解决办法:
在UITextFieldDelegate中的textFieldShouldBeginEditing:代理方法中注册键盘通知,在监听方法里,接收到UIKeyboardDidHideNotification时,处理完自己需要视图滚动之后,在通知中心移除自己。
附上精简代码
注册键盘通知
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardObserver:) name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardObserver:) name:UIKeyboardDidHideNotification object:nil];
return YES;
}
在监听方法中接收到键盘收起的事件后移除监听
-(void)keyboardObserver:(NSNotification*)noti
{
NSValue *value = [noti.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
CGRect keyframe = [value CGRectValue];
if ([noti.name isEqualToString:UIKeyboardDidShowNotification]) {
}
}else if ([noti.name isEqualToString:UIKeyboardDidHideNotification]){
//do something...
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
}
这个解决办法的好处在于,只有当某个输入框成为焦点的时候,才会响应键盘通知,当键盘收起的时候,通知中心移除监听者。单个页面多个输入框,多个页面多个输入框(类似弹窗和背景页都会有输入框的情况)不会互相影响。
也就是是说,处理键盘事件的生命周期只有在某一个输入框成为焦点开始,到键盘收起的时间。