3 回答
TA贡献1847条经验 获得超11个赞
结果我第一次猜到-sizeThatFits:
并没有完全错。它似乎有效,但前提是WebView的帧在发送之前被设置为最小大小。-sizeThatFits:
..在此之后,我们可以通过适当的尺寸来纠正错误的帧大小。这听起来很可怕,但其实没那么糟。因为我们两个帧都是在彼此之后进行更改的,所以视图不会更新,也不会闪烁。
当然,我们必须等到内容加载之后,所以我们将代码放入-webViewDidFinishLoad:
委托方法
OBJ-C
- (void)webViewDidFinishLoad:(UIWebView *)aWebView { CGRect frame = aWebView.frame; frame.size.height = 1; aWebView.frame = frame; CGSize fittingSize = [aWebView sizeThatFits:CGSizeZero]; frame.size = fittingSize; aWebView.frame = frame; NSLog(@"size: %f, %f", fittingSize.width, fittingSize.height);}
SWIFT 4.x
func webViewDidFinishLoad(_ webView: UIWebView) { var frame = webView.frame frame.size.height = 1 webView.frame = frame let fittingSize = webView.sizeThatFits(CGSize.init(width: 0, height: 0)) frame.size = fittingSize webView.frame = frame}
我应该指出另一种方法使用JavaScript。不确定哪种解决方案效果更好。
两个讨厌的解决方案我更喜欢这个。
TA贡献1789条经验 获得超10个赞
[webView sizeThatFits:CGSizeZero]
CGSizeZero
此方法的默认实现返回视图边界矩形的大小部分。子类可以重写此方法,以根据任何子视图的所需布局返回自定义值。例如,UISwitc对象返回一个固定大小值,该值表示开关视图的标准大小,而UIImageView对象返回它当前显示的图像的大小。
[webView sizeThatFits: ...]
width
webView
sizeThatFits
CGSizeZero
webView.scrollView.scrollEnabled = NO
scrollView
.
webView
width
height
webView
OBJ-C
- (void)webViewDidFinishLoad:(UIWebView *)aWebView{ aWebView.scrollView.scrollEnabled = NO; // Property available in iOS 5.0 and later CGRect frame = aWebView.frame; frame.size.width = 200; // Your desired width here. frame.size.height = 1; // Set the height to a small one. aWebView.frame = frame; // Set webView's Frame, forcing the Layout of its embedded scrollView with current Frame's constraints (Width set above). frame.size.height = aWebView.scrollView.contentSize.height; // Get the corresponding height from the webView's embedded scrollView. aWebView.frame = frame; // Set the scrollView contentHeight back to the frame itself.}
SWIFT 4.x
func webViewDidFinishLoad(_ aWebView: UIWebView) { aWebView.scrollView.isScrollEnabled = false var frame = aWebView.frame frame.size.width = 200 frame.size.height = 1 aWebView.frame = frame frame.size.height = aWebView.scrollView.contentSize.height aWebView.frame = frame;}
webView
scrollView
webViews
webViews
webView.scrollView.scrollEnabled = NO
height
contentSize
scrollView
webViews
webView
frame.size.height
TA贡献1812条经验 获得超5个赞
这个webViewDidFinishLoad
方法可以多次调用,第一个值由sizeThatFits
只是最终尺寸的一部分。然后不管出于什么原因下一次打电话到sizeThatFits
什么时候webViewDidFinishLoad
再次触发将错误地返回与以前相同的值!这将随机发生在相同的内容上,就好像是某种并发问题一样。也许随着时间的推移,这种行为已经改变了,因为我正在为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;}
SWIFT(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 }}
更新:我发现,正如评论中提到的,这似乎没有抓住内容缩水的情况。不确定所有的内容和操作系统版本是否正确,试一试。
- 3 回答
- 0 关注
- 482 浏览
添加回答
举报