避免scrollview内部控件输入时被键盘遮挡,监听键盘弹起,配合做滚动

Posted huaida

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了避免scrollview内部控件输入时被键盘遮挡,监听键盘弹起,配合做滚动相关的知识,希望对你有一定的参考价值。

1,监听键盘
2,根据当前键盘弹起高度与控件的底部位置计算滑动距离
3,根据滑动距离在键盘弹起和隐藏是分别设置动画完成滑动
 
 
实现:
1,监听键盘使用
 
#pragma mark - 键盘监听
-(void)AddObserverForKeyboard

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKeyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKeyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

-(void)removeObserverForKeyboard

    [[NSNotificationCenter defaultCenter]removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter]removeObserver:self name:UIKeyboardWillHideNotification object:nil];

在viewDidAppear和viewDidDisappear中添加和移除通知
 
2,计算滑动距离
 
通知中带有键盘的高度
CGRect keyboardRect = [[notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGFloat keyboardHeight = keyboardRect.size.height;
 
获取第一响应者控件在window坐标系中的底部的Y值
window的坐标系为手机的左上角 ,通过frame转换后可以计算出控件在window坐标系中的位置相对位置,加上高度就可以算出bottom的Y值
键盘同样添加在window中,因此可以用window中的坐标系做计算。
这种计算方式复用性高,如果转换坐标系为控制器View的话,在子控制器情况下,计算的距离不是真正距离屏幕顶部的距离。
因为ios中默认坐标系原点都为左上角,因此我们无法直接取得与底部的距离,间接计算使用的是顶部距离和高度,所以一次性取到实际与屏幕顶部的距离在计算过程中会更加方便。
关键方法
1》取到第一响应者
UIWindow *keyWindow =[[UIApplication sharedApplication] keyWindow];
UIView *firstResponder = [keyWindow performSelector:@selector(firstResponder)];
2》计算第一响应者在window中的相对位置
CGRect toRect = [firstResponder.superview convertRect:firstResponder.frame toView:keyWindow];
3》计算滑动距离
CGFloat firstResponderBottom = toRect.origin.y+toRect.size.height + marginValue;
CGFloat space =   firstResponderBottom + keyboardHeight  - keyWindow.frame.size.height;
 
3,masonry动画
 
self.view 为 scrollview父View
        [self.view setNeedsUpdateConstraints];
        [UIView animateWithDuration:0.25 animations:^
            [self.scrollView mas_updateConstraints:^(MASConstraintMaker *make)
                make.top.equalTo(self.view).offset(-space);
                make.bottom.equalTo(self.signUpButton.mas_top).offset(-space);
            ];
            [self.view layoutIfNeeded];
           
        ];
 
 
对 scrollview添加动画时,如果动画的方式是拉长scrollview,即使没有对scrollView的contentOffset操作,同样会触发scrollView的滚动代理方法,
因此滑动的思路是对scrollView整体移动。要同时修改顶部和底部的约束。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

以上是关于避免scrollview内部控件输入时被键盘遮挡,监听键盘弹起,配合做滚动的主要内容,如果未能解决你的问题,请参考以下文章

iOS-监听键盘输入,视图整体上移或恢复-避免输入遮挡

android dialog中软键盘遮挡输入编辑框edittextt

ZYKeyboardUtil 全自动处理键盘遮挡事件

android开发 软键盘出现后 防止EditText控件遮挡 总体平移UI

ZYKeyboardUtil 全自动处理键盘遮挡事件

h5开发安卓软键盘遮挡解决方案