键盘出现后 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@恢复原值。

有很多方法可以解决这个问题,每个创建可编辑文本的人都会在某个时候处理它。这些年来我用过很多,我敢肯定有更好的我什至没见过。

我上次的做法是修改UIScrollViewcontentInset 并保存原来的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 后自动上移,避免键盘被遮住

我可以使用 UIWebView (iOS) 自动登录 youtube 吗?

当键盘出现在 iOS 中时,将 UIView 上移

当用户单击 UIWebView 内的文本字段时,出现键盘后屏幕不会向上移动