高度小于 101px 的 UIWebView 不可选?
UIWebView with height less than 101px not selectable?
我正在开发一个应用程序,可以将 HTML 的小块加载到多个网络视图中。我希望此 HTML 可供用户选择,以便他们可以复制和粘贴其中的部分内容。这工作得很好,但是 仅当内容大于 100px
时 。由于某些原因,如果再短一些,用户将无法选择内容。
重现步骤:
- 创建一个宽度为322、高度为100的UIWebView并添加到视图中
- 在网络视图上调用
loadHTMLString: "W " * 64, baseURL: nil
。 (在我的屏幕上,这是完整的 4 行 "W"s)
- 单击并按住其中一个 "W",请注意 copy/paste 菜单 不会出现
- 在网络视图上调用
loadHTMLString: "W " * 65, baseURL: nil
。 (在我的屏幕上,最后一个 "W" 在第 5 行)
- 单击并按住其中一个 "W",请注意 copy/paste 菜单 会出现
我尝试了很多东西,以了解这里发生的事情。我按照相同的步骤,但从 101 而不是 100 的高度开始,它可以完美地找到只有 4 行。
我认为这可能是 iOS 中的错误?也许吧?
我 运行 iOS 9.2
, Xcode 7.2.1
这里有没有人知道为什么会发生这种情况,或者是否有任何解决方法可以解决这个问题?
我尝试了一些解决方法,但无济于事。
我发现的唯一解决方法:使用 WKWebView
-- 它没有这个问题。
目前,从 iOS 9 开始,您无法通过 Interface Builder 添加 WKWebView
。这是因为它不受支持。只要 WKWebView
header 将其声明为 NS_UNAVAILABLE
:
,您就无法将其包含在 IB 中
- (instancetype)initWithCoder:(NSCoder *)coder NS_UNAVAILABLE;
相反,您可以将其声明为 属性,并在 viewDidLoad
实现中对其进行实例化,如下所示:
self.webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 200, 320, 100)];
嗯,webview 假设加载 html 代码,但不是纯字符串,这可能会混淆它。如果在前面加上<!DOCTYPE HTML>
,不管字符串多短都可以被选中
将 Web 视图的 scalesPageToFit
设置为 true 似乎可以解决问题,但前提是高度为 100。如果高度为 99 或更低,则同样的问题仍然存在。但是看到 scalesPageToFit
和这个特征之间的关系以及 100 的高度很奇怪。看看 101,100,99 的高度,似乎这里发生了某种浮点计算问题。绝对是一个错误。
经过更多调查,我发现如果将高度设置为 100.5,则内容是可选的。似乎是 Web 视图实现中的某种舍入问题。
当我查看 web 视图的滚动视图的 contentSize 时,似乎当滚动视图的 contentSize 超过 100 时选择有效。因此,如果您处理 webviewDidFinishLoad
并在那里检查 contentSize 是否小于 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)
}
}
我正在开发一个应用程序,可以将 HTML 的小块加载到多个网络视图中。我希望此 HTML 可供用户选择,以便他们可以复制和粘贴其中的部分内容。这工作得很好,但是 仅当内容大于 100px
时 。由于某些原因,如果再短一些,用户将无法选择内容。
重现步骤:
- 创建一个宽度为322、高度为100的UIWebView并添加到视图中
- 在网络视图上调用
loadHTMLString: "W " * 64, baseURL: nil
。 (在我的屏幕上,这是完整的 4 行 "W"s) - 单击并按住其中一个 "W",请注意 copy/paste 菜单 不会出现
- 在网络视图上调用
loadHTMLString: "W " * 65, baseURL: nil
。 (在我的屏幕上,最后一个 "W" 在第 5 行) - 单击并按住其中一个 "W",请注意 copy/paste 菜单 会出现
我尝试了很多东西,以了解这里发生的事情。我按照相同的步骤,但从 101 而不是 100 的高度开始,它可以完美地找到只有 4 行。
我认为这可能是 iOS 中的错误?也许吧?
我 运行 iOS 9.2
, Xcode 7.2.1
这里有没有人知道为什么会发生这种情况,或者是否有任何解决方法可以解决这个问题?
我尝试了一些解决方法,但无济于事。
我发现的唯一解决方法:使用 WKWebView
-- 它没有这个问题。
目前,从 iOS 9 开始,您无法通过 Interface Builder 添加 WKWebView
。这是因为它不受支持。只要 WKWebView
header 将其声明为 NS_UNAVAILABLE
:
- (instancetype)initWithCoder:(NSCoder *)coder NS_UNAVAILABLE;
相反,您可以将其声明为 属性,并在 viewDidLoad
实现中对其进行实例化,如下所示:
self.webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 200, 320, 100)];
嗯,webview 假设加载 html 代码,但不是纯字符串,这可能会混淆它。如果在前面加上<!DOCTYPE HTML>
,不管字符串多短都可以被选中
将 Web 视图的 scalesPageToFit
设置为 true 似乎可以解决问题,但前提是高度为 100。如果高度为 99 或更低,则同样的问题仍然存在。但是看到 scalesPageToFit
和这个特征之间的关系以及 100 的高度很奇怪。看看 101,100,99 的高度,似乎这里发生了某种浮点计算问题。绝对是一个错误。
经过更多调查,我发现如果将高度设置为 100.5,则内容是可选的。似乎是 Web 视图实现中的某种舍入问题。
当我查看 web 视图的滚动视图的 contentSize 时,似乎当滚动视图的 contentSize 超过 100 时选择有效。因此,如果您处理 webviewDidFinishLoad
并在那里检查 contentSize 是否小于 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)
}
}