UIWebView不完全加载,高度变化

时间:2013-10-22 01:39:17

标签: ios objective-c uiwebview uiscrollview

我有一个包含一些标签的视图控制器和一个在其中加载一些html的UIWebView。所有这些标签和UIWebView都是UIScrollView的子视图。我已禁用UIWebView的滚动,因此标签和UIWebView在UIScrollView中一起滚动。

然后我找到了UiWebView内容的大小,根据内容大小更改了UIWebView大小,然后将滚动视图的大小设置为webview的大小。这是我通过在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;

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

3 个答案:

答案 0 :(得分:10)

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

解决方案1:您已经解释了问题中的第一个解决方案。这个解决方案只有在UIScrollView中的UIWebView中只涉及文本时才有效。如果有图像和ajax或任何懒惰加载的东西,这个解决方案将不会在第一次给你正确的高度。

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; 

解决方案2:另一种解决方案是使用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;

解决方案3:最后一个解决方案是适用于我的解决方案,它肯定会解决您的问题。它涉及合并我描述的前两个解决方案中的代码。也就是说,你将使用javascript获得高度,因为它每次都给出正确的高度,然后在第一个解决方案中使用其余的代码并增加几点。注意我添加了+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;

希望这有帮助!

答案 1 :(得分:1)

WebView以异步方式加载其所有内容。

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

答案 2 :(得分:1)

由于UIWebView在后台加载,您必须等到它加载页面,然后计算出高度。

这里有一种方法:https://stackoverflow.com/a/3937599/210171

但是,我通常使用javascript技术。在您的网络视图委托中,将-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