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

我有一个视图控制器包含一些标签和一个UIWebView加载一些HTML。 所有这些标签和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向上移动了一点,阻止了它上面的所有标签。 我做错了什么,如何解决它? 谢谢!


当您尝试在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;

希望这可以帮助!


WebView异步加载其所有内容。

你必须等待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=%fn", contentHeight ) ;
}

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

如果您的图像没有设置其大小属性,则图像加载时内容的高度可能会继续发生变化。 在这种情况下,请在这里查看我的答案:https://stackoverflow.com/a/12030878/210171

链接地址: http://www.djcxy.com/p/77421.html

上一篇: UIWebView Doesn't Load Completely, Height Varies

下一篇: UIWebView dones't resize correctly when orientation change?