高度小于101px的UIWebView无法选择?

时间:2016-03-09 01:12:30

标签: ios xcode uiwebview

我正在开发一个将小块HTML加载到多个网页视图中的应用。我希望用户可以选择这个HTML,这样他们就可以复制和粘贴部分HTML。这项工作完全正常,但当内容大于100px时, 。出于某种原因,如果它更短,则用户无法选择内容。

重现的步骤:

  1. 创建宽度为322,高度为100的UIWebView并将其添加到视图中
  2. 在网页浏览中调用loadHTMLString: "W " * 64, baseURL: nil。 (在我的屏幕上,这是4行完整的“W”)
  3. 点击并按住其中一个“W”,请注意复制/粘贴菜单 不会
  4. 在网页浏览中调用loadHTMLString: "W " * 65, baseURL: nil。 (在我的屏幕上,最后一个“W”在第5行)
  5. 点击并按住其中一个“W”,注意复制/粘贴菜单 出现
  6. 我尝试了很多东西,了解这里发生了什么。我按照相同的步骤操作,但从高度101开始而不是100开始,只需4行即可完美找到。

    我认为这可能是iOS中的一个错误?可能?

    我正在运行iOS 9.2,使用Xcode 7.2.1

    这里有没有人知道为什么会发生这种情况,或者我是否有任何可以解决这个问题的工作?

3 个答案:

答案 0 :(得分:3)

我尝试了一些解决方法,但无济于事。

我找到的唯一解决方法:使用WKWebView - 它没有此问题。

目前,从iOS 9开始,您无法通过Interface Builder添加WKWebView。这是因为它不受支持。只要WKWebView标头将其声明为NS_UNAVAILABLE,您就无法将其包含在IB中:

- (instancetype)initWithCoder:(NSCoder *)coder NS_UNAVAILABLE;

相反,您可以将其声明为属性,并在viewDidLoad实现中实例化,如下所示:

self.webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 200, 320, 100)];

答案 1 :(得分:1)

好吧,webview假设加载html代码,但不是纯字符串,这可能会混淆它。如果您在前面添加<!DOCTYPE HTML>,无论字符串有多短,都可以选择它。

答案 2 :(得分:0)

将Web视图的scalesPageToFit设置为true似乎可以解决问题,但只有在高度为100的情况下才会解决问题。如果99或更低,则问题仍然存在。但是看到scalesPageToFit和这个特征之间的关系以及高度为100的情况很奇怪。看看101,100,99的高度,这似乎是某种浮点计算问题。绝对是一个错误。

经过更多调查,我发现如果你将高度设置为100.5,那么内容是可选择的。看起来像Web视图实现中的某种四舍五入问题。

当我查看网页视图的滚动视图的contentSize时,似乎当scrollview contentSize超过100时,选择工作正常。因此,如果您处理webviewDidFinishLoad并在那里检查contentSize是否&lt; 100然后你可以通过附加<br>来重新加载字符串。只要它小于100,你继续加载每次加载<br>到加载的字符串。这应该适合你。

func webViewDidFinishLoad(webView: UIWebView) {
    print(webview.scrollView.contentSize)
    var content = webview.stringByEvaluatingJavaScriptFromString("document.body.innerHTML")
    if content != nil && webview.scrollView.contentSize.height <= 100 {
        content! += "<br>"
        webview.loadHTMLString(content!, baseURL: nil)
    }
}