避免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];
-(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;
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)];
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;
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];
];
[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内部控件输入时被键盘遮挡,监听键盘弹起,配合做滚动的主要内容,如果未能解决你的问题,请参考以下文章
android dialog中软键盘遮挡输入编辑框edittextt