iPhone-获取UIWebView的内容大小
我在UIWebView中打开本地Pdf文件,然后尝试调整UIWebView的大小,使WebView高度等于WebView内容高度。我使用这行代码获取WebView内容的高度iPhone-获取UIWebView的内容大小,iphone,objective-c,ios5,Iphone,Objective C,Ios5,我在UIWebView中打开本地Pdf文件,然后尝试调整UIWebView的大小,使WebView高度等于WebView内容高度。我使用这行代码获取WebView内容的高度 - (float) getWebViewContentHeight:(UIWebView *)view { CGRect aFrame = view.frame; aFrame.size.height = [view sizeThatFits:[[UIScreen main
- (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上也能运行吗 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。丑陋的方式 使用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;
}
}
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;
}
Swift(2.2):
func webViewDidFinishLoad(webView:UIWebView){
}
更新:我发现正如评论中提到的,这似乎没有抓住内容缩水的情况。不确定它是否适用于所有内容和操作系统版本,请尝试一下。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;
}
Swift(2.2):
func webViewDidFinishLoad(webView:UIWebView){
}
更新:我发现正如评论中提到的,这似乎没有抓住内容缩水的情况。不确定它是否适用于所有内容和操作系统版本,试一试。请说明您面临的错误或问题。iOS 5中没有sizeThatFits。当我在iOS 4.3中运行上述代码时,它会给出UIWebView内容的确切高度,但当我在iOS 5.0上运行此代码时,它会给出UIWebView的高度,而不是UIWebView内容的高度。请说明您面临的错误或问题当我在iOS 4.3中运行上述代码时,iOS 5中没有提到.sizeThatFits,它给出了UIWebView内容的确切高度,但当我在iOS 5.0上运行此代码时,它给出了UIWebView的高度,而不是UIWebView内容的高度。在第一种情况下,它返回0.0000,在第二种情况下,它返回的是webView的高度,而不是高度网络视图的内容;您是否正在尝试
webScrollView.contentSize
?是webScrollView.contentSize.Height API已更改,您可以使用[(UIWebView)scrollView]访问UIWebView
的内部滚动视图,而不是在子视图中循环
webview.scrollview.contentSize始终返回高度,从不返回小于当前高度的高度。您只能得到bigger在第一种情况下,它返回0.0000,在第二种情况下,它返回的是webView的高度,而不是webView内容的高度;您是否正在尝试webScrollView.contentSize
?是webScrollView.contentSize.Height API已更改,您可以使用[(UIWebView)scrollView]访问UIWebView
的内部滚动视图,而不是在子视图中循环
webview.scrollview.contentSize始终返回高度,从不返回小于当前高度的高度。你只能变得更大