【问题标题】:UIWebView Doesn't Load Completely, Height VariesUIWebView 没有完全加载,高度变化
【发布时间】:2013-10-30 17:16:07
【问题描述】:

我有一个包含一些标签的视图控制器和一个正在其中加载一些 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 向上移动了一点,挡住了它上面的所有标签。我做错了什么以及如何解决它?谢谢!

【问题讨论】:

  • 您是否也在记录滚动视图?这可能会显示一个有趣的结果。任何 xib 警告消息?
  • @DavidDelMonte 如果我使用 NSString *webHeight = [myWebView stringByEvaluatingJavaScriptFromString:@"document.height;"]; NSLog(@"WebView 高度 %@", webHeight);然后它每次都显示确切的高度,但这里 webHeight 是一个 NSString,我如何将 myWebView 的高度设置为 webHeight 的高度??
  • 如果你使用 NSInteger *webHeightInt = [webHeight intValue]; (我的头,不要在家里尝试这个..(或 NSUInteger)
  • 我也在努力在 UIScrollView 中保持内容稳定。似乎有点狡猾。尤其是当您将设备旋转添加到组合中时。

标签: ios objective-c uiwebview uiscrollview


【解决方案1】:

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

希望这会有所帮助!

【讨论】:

  • 第三种解决方案有效,但当 HTML 字符串包含图像源时无效。
  • @Jessica,你为什么要加 125?
【解决方案2】:

WebView 异步加载其所有内容。

您必须等待webViewDidFinishLoading 加载 html(还不是图像数据!)然后它知道 html 的大小。 sizeToFit 应该可以工作。

【讨论】:

  • 这假设 imgs(和其他引用外部资源的标签)设置了 width=XY 和 height=XY 属性!
  • 您能否在答案中提供一些代码以及如何使用 sizeToFit??
  • @AJ112 看看documentation for UIView。如果你有UIWebView* webView,可以拨打[webView sizeToFit]
  • 我也有同样的问题,我使用 [webView sizeToFit] 不起作用,杰西卡的第三个解决方案确实对我有用。
  • @Daij-Djan 如何在加载所有图像数据的情况下访问总高度?
【解决方案3】:

由于 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

【讨论】:

  • 一种不同的 javascript 对我有用,但仍然是一个问题,请参阅我在问题中的更新。谢谢!可能是我在获得高度后做错了什么。查看我的更新
  • 您确定封闭滚动视图的位置吗?尝试设置scrollView.backgroundColor = [ UIColor redColor ] 或类似的东西,这样你就可以看到它的位置。对您的 Web 视图执行相同操作:webView.backgroundColor = [ UIColor orangeColor ]...
猜你喜欢
  • 2010-10-30
  • 1970-01-01
  • 2014-11-20
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多