6

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

4

3 回答 3

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;

希望这可以帮助!

于 2013-10-30T00:46:38.970 回答
1

WebView 异步加载其所有内容。

您必须等待webViewDidFinishLoading加载 html(尚未加载图像数据!)然后它知道 html 的大小。应该有sizeToFit工作。

于 2013-10-23T00:53:39.127 回答
1

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

于 2013-10-25T06:00:11.873 回答