为了账号安全,请及时绑定邮箱和手机立即绑定

如何确定UIWebView的内容大小?

如何确定UIWebView的内容大小?

iOS
ibeautiful 2019-07-15 09:34:31
如何确定UIWebView的内容大小?我有一个UIWebView具有不同的(单页)内容。我想知道CGSize适当调整父视图大小的内容。明目张胆-sizeThatFits:不幸的是,只返回WebView的当前帧大小。
查看完整描述

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。不确定哪种解决方案效果更好。

两个讨厌的解决方案我更喜欢这个。


查看完整回答
反对 回复 2019-07-15
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

我有另一个很好的解决方案。

一方面,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.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..所有这些webViewswebView.scrollView.scrollEnabled = NO,我必须添加的最后一段代码是计算height.的.contentSize我的习俗scrollView嵌入这些webViews,但就像总结我的webViewframe.size.height用上面描述的技巧计算.。


查看完整回答
反对 回复 2019-07-15
?
慕雪6442864

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    }}

更新:我发现,正如评论中提到的,这似乎没有抓住内容缩水的情况。不确定所有的内容和操作系统版本是否正确,试一试。


查看完整回答
反对 回复 2019-07-15
  • 3 回答
  • 0 关注
  • 482 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信