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