如何确定UIWebView的内容大小?

如何确定UIWebView的内容大小?

我有一个UIWebView具有不同的(单页)内容。我想知道CGSize适当调整父视图大小的内容。明目张胆-sizeThatFits:不幸的是,只返回WebView的当前帧大小。



ibeautiful
浏览 483回答 3
3回答

回首忆惘然

结果我第一次猜到-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.xfunc 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。不确定哪种解决方案效果更好。两个讨厌的解决方案我更喜欢这个。

至尊宝的传说

我有另一个很好的解决方案。一方面,Ortwin的方法和解决方案只适用于IOS 6.0及更高版本,但无法在IOS 5.0、5.1和5.1.1上正确工作;另一方面,我不喜欢也不能理解Ortwin的方法,这是方法的使用。[webView sizeThatFits:CGSizeZero]带参数CGSizeZero如果您阅读了有关此方法及其参数的苹果正式文档,它会清楚地说明:此方法的默认实现返回视图边界矩形的大小部分。子类可以重写此方法,以根据任何子视图的所需布局返回自定义值。例如,UISwitc对象返回一个固定大小值,该值表示开关视图的标准大小,而UIImageView对象返回它当前显示的图像的大小。我的意思是,就像他在没有任何逻辑的情况下遇到了他的解决方案,因为读取文档,参数传递给[webView sizeThatFits: ...]至少应该width..使用他的解决方案,所需的宽度设置为webView呼叫前的帧sizeThatFits带着CGSizeZero参数。因此,我认为这个解决方案是在iOS 6上“偶然”地工作。我设想了一种更合理的方法,它的优点是适用于iOS 5.0和更高版本.在复杂的情况下,多个WebView(及其属性)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.xfunc 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用上面描述的技巧计算.。

慕雪6442864

这个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    }}更新:我发现,正如评论中提到的,这似乎没有抓住内容缩水的情况。不确定所有的内容和操作系统版本是否正确,试一试。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS