问题:当UITextField输入会弹出键盘,可以通过通知来监听键盘的显示或者隐藏获取到键盘的高度。当切换键盘的输入方法,就会改变键盘的高度,从而导致UIKeyboardWillShowNotification 键盘通知 被触发了两次或者多次;导致视图不止一次网上移动,从而导致UI界面显示不正常!
1. 当输入文本框添加到不可滚动的View上
在viewDidLoad方法中监听键盘的弹出和隐藏
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
实现通知方法
####完整正确的写法
-(void) keyboardWillShow:(NSNotification *)notiInfo{
CGRect keyBoardRect=[notiInfo.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect selfViewFrame = self.view.frame;
selfViewFrame = CGRectMake(0, -keyBoardRect.size.height, self.view.frame.size.width, self.view.frame.size.height);
self.view.frame = selfViewFrame;
}
-(void) keyboardWillHide:(NSNotification *)notiInfo{
CGRect selfViewFrame = self.view.frame;
selfViewFrame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
self.view.frame = selfViewFrame;
}
### 错误原因
-(void) keyboardWillShow:(NSNotification *)notiInfo{
CGRect keyBoardRect=[notiInfo.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect selfViewFrame = self.view.frame;
## 最重要的就是不能执行像下面这句直接改变origin.y
selfViewFrame.origin.y = selfViewFrame.origin.y - keyBoardRect.size.height;(错误原因,重复的➖坐标)
self.view.frame = selfViewFrame;
}
记得在视图控制器销毁的时候移除通知
-(void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}
2. 当文本框添加到滚动视图上时,比如tableViewCell上面添加输入框,点击弹出键盘输入内容。
:通知的实现方法可以改变滚动的内边距,达到输入不被键盘遮挡
-(void) keyboardWillShow:(NSNotification *)notiInfo{
CGRect keyBoardRect=[notiInfo.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
table.contentInset = UIEdgeInsetsMake(0, 0, keyBoardRect.size.height, 0);
}
-(void) keyboardWillHide:(NSNotification *)notiInfo{
table.contentInset = UIEdgeInsetsZero;
}
3.注册或者登录
- (void)isOldKeyBoardShow:(NSNotification *)notification {
NSDictionary *info = [notification userInfo];
NSValue *value = info[UIKeyboardFrameEndUserInfoKey];
CGPoint keyboard = [value CGRectValue].origin;
CGSize keyboardS = [value CGRectValue].size;
if (keyboard.y< screenH)
{//显示键盘
loginView.center = CGPointMake(self.view.center.x, self.view.center.y- (keyboardS.height/2));
}else{
loginView.center = CGPointMake(self.view.center.x, self.view.center.y);
}
registerView.center = self.view.center;
}
4.问题:在使用 IQKeyboardManager 方法库的时候遇到的bug,键盘弹出,不仅使window 视图偏移键盘的高度,而且还导致导航栏也偏移出可视界面,从而破环了导航栏,导致整个app 界面出现问题!如下图:
contentOffset改变
偏移量改变导致刷新视图一直显示
解决:不使用 IQKeyboardManager 三方库,直接注销,神奇的是问题依然存在。必须把三方库移除工程,键盘的弹出才最终正常!