ios - UIWebView 中的 contentEditable/designMode 时自动滚动

标签 ios uiwebview scroll contenteditable designmode

我正在为我正在开发的 iPhone 应用程序尝试一个富文本编辑器(具有 HTML 导出功能),并决定使用 iOS 5 的 WebKit 支持 contentEditable/designMode。 我遇到了一个问题,这个问题正在解决我所需要的问题。在 UIWebView 中编辑内容时,不会自动滚动以跟随光标,例如在 UITextView 中。打字时,光标继续在 scrollView 下方,用户必须手动向上滚动。

这里是一些相关的代码:

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSString *string = @"document.body.contentEditable=true;document.designMode='on';void(0)";
    [webView stringByEvaluatingJavaScriptFromString:string];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
}

有什么办法可以解决这个问题吗?我不确定这是否也发生在 Safari 中或仅发生在 UIWebView 的 WebKit 实现中。

如果您遇到此问题,请务必前往 https://bugreport.apple.com并复制 rdar://16455638

最佳答案

经过几个小时的研究,我找到了更好的解决方案,所以我想分享一下。

在 iOS 5 的 contentEditable 实现中有一个错误,主 scrollView 不会随着插入符号滚动。如果使 body 标签(或任何动态大小的元素)成为 contentEditable,插入符号将始终离开屏幕。

如果将可编辑的 div 设置为溢出:滚动,您会注意到 div 会滚动。默认情况下,div 的滚动不会“反弹”或有滚动条,但您可以将 -webkit-overflow-scrolling: touch 属性应用于 div 以解决此问题。

根据这些信息,您可以像这样使用包装器修复它:

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no;"/>
<style type="text/css">
    html, body {height: 100%;}
    body {
        margin: 0;
    }
    #wrap {
        height: 100%;
        width: 100%;
        overflow-y: scroll;
        -webkit-overflow-scrolling: touch;
    }
    #editor {
        padding: 10px;
    }
</style>
</head>
<body>
<div id="wrap">
    <div id="editor" contenteditable="true">

    </div>
</div>
</body>
</html>

基本上您滚动的是 div 而不是文档。

不幸的是,div 的“scrollView”无法识别虚拟键盘,因此插入符号会消失在键盘后面。但是,您会注意到插入符位置仍在键盘后面底部的屏幕上。因此,要解决此问题,请降低 div/UIWebView 的高度以容纳键盘。

您可能还想做的其他事情是在主 ScrollView 上禁用滚动:

webView.scrollView.scrollEnabled = NO;

主 scrollView 无论如何都不应该滚动,但它应该防止任何滚动故障。

关于ios - UIWebView 中的 contentEditable/designMode 时自动滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8523232/

相关文章:

ios - Flutter:如何修复 ITMS-90809:已弃用的 API 使用 - Apple 将停止接受使用 UIWebView API 的应用程序提交

javascript - 垂直滚动 Stellar JS 上的水平位置移动

ios - CKQuery,如何从记录中获取所有字段?

ios - 更改 UIScrollVIew Content Inset 触发 scrollViewDidScroll

ios - 自定义sip server 配合doubang的idoubs使用

ios - 如何将 "import"UIView XIB 转换为 UIViewController XIB?

ios - uiwebview 不适用于 Swift 2.0

javascript - 能否以编程方式填充 UIWebView Web 表单?

android - GridView 滚动问题

css - 溢出 : scroll on ui-router ui-view