键盘出现后 UIWebView 自动上移
Posted
技术标签:
【中文标题】键盘出现后 UIWebView 自动上移【英文标题】:UIWebView automatically is shifted up after keyboard appears 【发布时间】:2014-08-18 13:51:25 【问题描述】:当键盘出现时,我的 UIWebView 向上移动,当键盘关闭时,webview 不会回到之前的位置。我在键盘出现或关闭之前和之后检查了 webview 的位置。令人惊讶的是,webview 的框架没有改变。但是我之前和之后看到的完全不同。
键盘出现之前: 当键盘出现时,webview 向上移动 当键盘关闭时,webview 不会向下移动到目前为止,我所做的是应用我从其他人那里读到的以下技术:
1) 观察键盘提示,然后适当调整
observe keyboard notification
2) 更改元标记,在元标记中也添加“height=device-height”
meta tag
3) 更改 webview 的属性:
_webView.contentMode = UIViewContentModeScaleAspectFit; _webView.scalesPageToFit = 是; _webView.autoresizingMask = (UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth);但是,以上所有这些建议都不起作用。你能帮帮我吗?
注意:我使用的是 ios7,XCODE 5
【问题讨论】:
您是否使用 iScroll 或任何其他 js 框架进行自定义滚动? 我们好像不用。但是在使用自定义滚动的情况下是什么意思? 删除 css 一次并尝试生成问题。试一试。 【参考方案1】:UIWebView
中有一个UIScrollView
,用于管理大于屏幕的内容。当您调整 UIScrollView
的高度时,它通常会影响其滚动位置。当您使用键盘缩小高度时,它会导致内容向上滚动以保持文本字段可见(通过修改contentOffset
),但是当您扩展高度时,它只会在底部显示更多内容并且不会更改@ 987654325@恢复原值。
有很多方法可以解决这个问题,每个创建可编辑文本的人都会在某个时候处理它。这些年来我用过很多,我敢肯定有更好的我什至没见过。
我上次的做法是修改UIScrollView
的contentInset
并保存原来的contentOffset
,以便以后重新填充。
设置您的通知
[[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 *)notification
NSDictionary *userInfo = [notification userInfo];
CGRect keyboardRect = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
CGFloat keyboardHeight = UIInterfaceOrientationIsPortrait(self.interfaceOrientation)?keyboardRect.size.height:keyboardRect.size.width;
CGFloat duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];
CGFloat animationStyle = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] floatValue];
self.tableViewOffset = self.tableView.contentOffset
UIEdgeInsets contentInsets = self.tableView.contentInset;
contentInsets.bottom = keyboardHeight;
[UIView animateWithDuration:duration delay:0 options:animationStyle animations:^
self.tableView.contentInset = contentInsets;
completion:nil];
- (void)keyboardWillHide:(NSNotification *)notification
NSDictionary *userInfo = [notification userInfo];
CGFloat duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];
CGFloat animationStyle = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] floatValue];
UIEdgeInsets contentInsets = self.tableView.contentInset;
contentInsets.bottom = 0;
[UIView animateWithDuration:duration delay:0 options:animationStyle animations:^
self.tableView.contentInset = contentInsets;
self.tableView.contentOffset = self.tableViewOffset;
completion:nil];
【讨论】:
tableViewOffset 是什么?和表视图?你的意思是 webView?tableViewOffset
只是我用来存储 contentOffset
之前的一个局部变量,以便我以后可以恢复它。 webView,tableView,嗯。它们都是UIScrollView
的包装器,我们正在讨论处理底层滚动视图。【参考方案2】:
我解决了我的问题是
1) 观察键盘何时关闭:
- (void)observeKeyboard [NotificationCenter addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; - (void)removeObserveKeyboard [NotificationCenter removeObserver:self name:UIKeyboardWillHideNotification object:nil];2)当键盘快要隐藏时,我们触发一个js向上滚动。
- (void)keyboardWillHide:(NSNotification *)notification [self scrollBackToTop]; //- 修复bug:出现键盘时UIWebView内容向上滚动 -(void)scrollBackToTop [_webView stringByEvaluatingjavascriptFromString:@"window.scrollTo(0, 0);"];感谢此链接:link
【讨论】:
以上是关于键盘出现后 UIWebView 自动上移的主要内容,如果未能解决你的问题,请参考以下文章
iOS开发-cell里面有textField,出现键盘自动上移
swift 点击Textfield 后自动上移,避免键盘被遮住