ScrollView解决软键盘遮挡输入框问题
2016-05-16 本文已影响1518人
_浅墨_
一、原理
如何在自己的代码中使用 content inset?当键盘在屏幕上时,有一个很好的用途:你想要设置一个紧贴屏幕的用户界面。当键盘出现在屏幕上时,你损失了几百个像素的空间,键盘下面的东西全都被挡住了。
现在,scroll view 的 bounds 并没有改变,content size 也并没有改变(也不需要改变)。但是用户不能滚动 scroll view。考虑一下之前一个公式:content offset 的最大值是 content size 和 bounds 的差。如果他们相等,现在 content offset 的最大值是 {x:0, y:0}.
scrollview现在开始出绝招,将界面放入一个 scroll view。scroll view 的 content size 仍然和 scroll view 的 bounds 一样大。当键盘出现在屏幕上时,你设置 content inset 的底部等于键盘的高度。
这允许在 content offset 的最大值下显示滚动区域外的区域。可视区域的顶部在 scroll view bounds 的外面,因此被截取了(虽然它在屏幕之外了,但这并没有什么)。
摘自:
http://objccn.io/issue-3-2/
二、示例
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}
-(void)viewDidDisappear:(BOOL)animated{
// 记得一定要注销通知监听,否则有时会导致crash
// 比如内存中两个类均收到通知,然后他们都想执行跳转,这个时候就crash了
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
NSLog(@"%@", NSStringFromCGPoint(self.fgScrollView.contentOffset));
}
- (void)keyboardWillShow:(NSNotification *)notification {
NSDictionary *info = [notification userInfo];
CGSize keyboardSize = [info[UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:[info[UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
[UIView setAnimationCurve:[info[UIKeyboardAnimationCurveUserInfoKey] integerValue]];
[UIView setAnimationBeginsFromCurrentState:YES];
UIEdgeInsets insets = UIEdgeInsetsMake(self.fgScrollView.contentInset.top, 0, keyboardSize.height, 0);
self.fgScrollView.contentInset = insets;
self.fgScrollView.scrollIndicatorInsets = insets;
self.fgScrollView.contentOffset = CGPointMake(self.fgScrollView.contentOffset.x, self.fgScrollView.contentOffset.y + keyboardSize.height);
[UIView commitAnimations];
}
- (void)keyboardWillHide:(NSNotification *)notification {
NSDictionary *info = [notification userInfo];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:[info[UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
[UIView setAnimationCurve:[info[UIKeyboardAnimationCurveUserInfoKey] integerValue]];
[UIView setAnimationBeginsFromCurrentState:YES];
UIEdgeInsets insets = UIEdgeInsetsMake(self.fgScrollView.contentInset.top, 0, 0, 0);
self.fgScrollView.contentInset = insets;
self.fgScrollView.scrollIndicatorInsets = insets;
[UIView commitAnimations];
}
三、附:
contentoffset vs contentinset
四、demo下载地址