webViewDidFinishLoad 方法可能被多次调用,sizeThatFits 返回的第一个值只是最终大小的一部分。然后无论出于何种原因,当 webViewDidFinishLoad 再次触发时,下一次调用 sizeThatFits 将错误地返回与之前相同的值!对于相同的内容,这将随机发生,就好像它是某种并发问题一样。也许这种行为随着时间的推移而改变了,因为我正在为 iOS 5 构建并且还发现 sizeToFit 的工作方式几乎相同(尽管以前不是这样?)
我已经确定了这个简单的解决方案:
- (void)webViewDidFinishLoad:(UIWebView *)aWebView
{
CGFloat height = [[aWebView stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue];
CGFloat width = [[aWebView stringByEvaluatingJavaScriptFromString:@"document.width"] floatValue];
CGRect frame = aWebView.frame;
frame.size.height = height;
frame.size.width = width;
aWebView.frame = frame;
}
斯威夫特(2.2):
func webViewDidFinishLoad(webView: UIWebView) {
if let heightString = webView.stringByEvaluatingJavaScriptFromString("document.height"),
widthString = webView.stringByEvaluatingJavaScriptFromString("document.width"),
height = Float(heightString),
width = Float(widthString) {
var rect = webView.frame
rect.size.height = CGFloat(height)
rect.size.width = CGFloat(width)
webView.frame = rect
}
}
更新:我发现如评论中所述,这似乎并没有发现内容缩小的情况。不确定是否适用于所有内容和操作系统版本,试一试。