1

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

4

2 回答 2

6

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

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;
    }
}
于 2012-04-24T14:21:47.910 回答
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
}

}

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

于 2016-04-12T10:08:57.257 回答