iPhone - 获取UIWebView的内容大小

时间:2012-04-24 13:35:56

标签: iphone objective-c ios5

我在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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

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
}

}

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