UIWebView不能完全加载,高度各不相同

我有一个视图控制器包含一些标签和一个UIWebView加载一些HTML。 所有这些标签和UIWebView都是UIScrollView的子视图。 我禁用了UIWebView的滚动,以便标签和UIWebView在UIScrollView中一起滚动。

然后我find了UiWebView中的内容的大小,根据内容的大小改变了UIWebView的大小,然后将滚动视图的大小设置为web视图的大小。 这是我通过在webViewDidFinishLoad中添加以下代码的方式:

CGRect frame = myWebView.frame; frame.size.height = 1; myWebView.frame = frame; CGSize fittingSize = [myWebView sizeThatFits:CGSizeZero]; frame.size = fittingSize; myWebView.frame = frame; NSLog(@"size: %f, %f", fittingSize.width, fittingSize.height); mainScrollView.contentSize = myWebView.bounds.size; 

因为我使用NSLog来查看webview内容的大小,我注意到它给同一内容不同的高度。 例如,如果我第一次打开视图控制器,它显示的高度等于915.0,当我回到导航,回到这个视图控制器,然后日志将显示大小为1012.0。

我相信这可能是由于在html内容中加载的图像。 任何人都可以告诉我怎样才能修复它第一次显示正确的高度? 谢谢!

更新:如果我使用不同的策略使用JavaScript,我已经尝试使用下面的代码:

 CGRect oldBounds = [[self myWebView] bounds]; CGFloat height = [[myWebView stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue]; NSLog(@"NEW HEIGHT %f", height); [myWebView setBounds:CGRectMake(oldBounds.origin.x, oldBounds.origin.y, oldBounds.size.width, height)]; mainScrollView.contentSize = myWebView.bounds.size; 

这段代码给了我正确的高度,每一次在日志里,这正是我想要的,但整个网页视图向上移动阻止所有上面的标签。 我做错了什么,如何解决? 谢谢!

当您尝试在UIScrollView中embeddedUIWebView和其他视图时,这是一个非常常见的问题。

解决scheme1:您已经解释了您的问题中的第一个解决scheme。 这个解决scheme只有在UIScrollView中只有UIWebView中涉及的文本时才有效。 如果有图片和Ajax或任何这种懒洋洋地加载,这种解决scheme将不会给你第一次正确的高度。

 CGRect frame = myWebView.frame; frame.size.height = 1; myWebView.frame = frame; CGSize fittingSize = [myWebView sizeThatFits:CGSizeZero]; frame.size = fittingSize; myWebView.frame = frame; NSLog(@"size: %f, %f", fittingSize.width, fittingSize.height); mainScrollView.contentSize = myWebView.bounds.size; 

解决scheme2:另一种解决scheme是使用JavaScript。 它每次都给你正确的高度,但是你将面临我无法排除故障的奇怪问题。 就你的情况来说,你说整个看法是稍微向上移动的。

 CGRect oldBounds = [[self myWebView] bounds]; CGFloat height = [[myWebView stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue]; NSLog(@"NEW HEIGHT %f", height); [myWebView setBounds:CGRectMake(oldBounds.origin.x, oldBounds.origin.y, oldBounds.size.width, height)]; mainScrollView.contentSize = myWebView.bounds.size; 

解决scheme3:最后的解决scheme是为我工作的解决scheme,它一定会解决您的问题。 它涉及到在我描述的前两个解决scheme中合并代码。 这就是你将得到使用JavaScript的高度,因为它提供了正确的高度,然后在第一个解决scheme中使用其余的代码,并增加几个点。 注意我加了+125.0,这是我解决它的方法:

 CGFloat height = [[myWebView stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue]; CGFloat width = [[myWebView stringByEvaluatingJavaScriptFromString:@"document.width"] floatValue]; CGRect frame = myWebView.frame; frame.size.height = height + 125.0; frame.size.width = width; myWebView.frame = frame; mainScrollView.contentSize = myWebView.bounds.size; 

希望这可以帮助!

WebViewasynchronous加载其所有内容。

你必须等待webViewDidFinishLoading所以加载的HTML(不是图像数据呢!)然后它知道HTML的大小。 有sizeToFit应该工作。

由于UIWebView在后台加载,你将不得不等待,直到它加载你的页面,然后找出高度。

一种方法是: https : //stackoverflow.com/a/3937599/210171 。

不过,我通常使用JavaScript技术。 在你的web视图委托中,改变你的-webViewDidFinishLoad:看起来像这样:

 - (void)webViewDidFinishLoad:(UIWebView *)webView { NSString * heightString = [webview stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"foo\").offsetHeight;"]; CGFloat contentHeight = [ heightString doubleValue ] ; NSLog( @"contentHeight=%f\n", contentHeight ) ; } 

(此代码取自https://stackoverflow.com/a/751326/210171

如果您的图片没有设置大小属性,内容的高度可能会随着图片的加载而不断变化。 在这种情况下,请参阅我的答案在这里: https : //stackoverflow.com/a/12030878/210171