UIWebView不完全加载,高度变化

AJ1*_*112 6 objective-c uiwebview uiscrollview ios

我有一个包含一些标签的视图控制器和一个在其中加载一些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; 
Run Code Online (Sandbox Code Playgroud)

当我使用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;
Run Code Online (Sandbox Code Playgroud)

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

Jes*_*ica 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; 
Run Code Online (Sandbox Code Playgroud)

解决方案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;
Run Code Online (Sandbox Code Playgroud)

解决方案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;
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!