【问题标题】:iPhone - get the Content Size of UIWebViewiPhone - 获取 UIWebView 的内容大小
【发布时间】:2012-05-05 03:43:45
【问题描述】:

我在我的 UIWebView 中打开本地 Pdf 文件,而不是尝试调整 UIWebview 的大小以使 WebView 高度等于 WebView 内容高度,我正在使用这行代码来获取 WebView 内容的高度

- (float) getWebViewContentHeight:(UIWebView *)view
{


    CGRect aFrame               = view.frame;

    aFrame.size.height  = [view sizeThatFits:[[UIScreen mainScreen] bounds].size].height;
    view.frame              = aFrame;

    return view.frame.size.height;
} 

此代码在 iOS 4.3 上完美运行,但在 iOS 5.0 上无法运行,谁能帮我请教如何获取 webView 的内容大小或使此代码也适用于 iOS 5

【问题讨论】:

  • 您遇到什么错误或问题请提及。
  • sizeThatFits 在 iOS 5 中不起作用,当我在 iOS 4.3 中运行上述代码时,它给了我 UIWebView 内容的确切高度,但是当我在 iOS 5.0 上运行此代码时,它给出了 UIWebview 的高度而不是UIWebView 内容的高度

标签: iphone objective-c ios5


【解决方案1】:

访问内容有点棘手,但在这里我将展示两种方法。

1.丑陋的方式

使用JS查询文档属性:

CGSize contentSize = CGSizeMake([[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollWidth;"] floatValue],
                                [[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"] floatValue]);

2。不那么丑的方式

UIWebView 是一个复合对象,其中包含一个内部UIScrollView。从 iOS 5.0 开始,您可以尝试抓取此滚动视图并将其contentSize 属性直接用作webView.scrollView.contentSize。如果你需要保持与 iOS 4.3 及之前版本的兼容性,你必须做一些黑魔法来获得滚动视图:

UIScrollView* webScrollView = nil;
for ( UIView* subview in [webView subviews] )
{
    if ( [subview isKindOfClass:[UIScrollView class]] )
    {
        webScrollView = (UIScrollView*)subview;
        break;
    }
}

【讨论】:

  • 在第一种情况下返回 0.0000,在第二种情况下返回 webView 的高度而不是 WebView 内容的高度;
  • 你在尝试webScrollView.contentSize吗?
  • 是 webScrollView.contentSize.height
  • API 发生了变化,不再循环遍历子视图,您可以使用[(UIWebView) scrollView] 访问UIWebView 的内部滚动视图
  • webview.scrollview.contentSize 总是返回高度 从不返回小于当前高度的高度。你只能变大
【解决方案2】:

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
}

}

更新:我发现如 cmets 中所述,这似乎并没有发现内容缩小的情况。不确定是否适用于所有内容和操作系统版本,请尝试一下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 2013-12-10
    • 1970-01-01
    • 2014-12-28
    相关资源
    最近更新 更多