美文网首页
UITextField文本输入适配键盘

UITextField文本输入适配键盘

作者: 二先生Developer | 来源:发表于2018-02-23 23:13 被阅读34次

问题:当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 三方库,直接注销,神奇的是问题依然存在。必须把三方库移除工程,键盘的弹出才最终正常!

相关文章

网友评论

      本文标题:UITextField文本输入适配键盘

      本文链接:https://www.haomeiwen.com/subject/oftsnxtx.html