UIWebView Doesn#39;t Load Completely, Height Varies(UIWebView 没有完全加载,高度变化)
问题描述
我有一个包含一些标签的视图控制器和一个正在其中加载一些 html 的 UIWebView.所有这些标签和 UIWebView 都是 UIScrollView 的子视图.我已禁用 UIWebView 的滚动,因此标签和 UIWebView 在 UIScrollView 内一起滚动.
I have a view controller containing some labels and a UIWebView that is loading some html in it. All these labels and UIWebView are subviews of a UIScrollView. I have disabled the scrolling of UIWebView so the labels and UIWebView scrolls all together inside the UIScrollView.
然后我找到了UiWebView里面内容的大小,根据内容大小改变了UIWebView的大小,然后将滚动视图的大小设置为webview的大小.这就是我在 webViewDidFinishLoad 中添加以下代码的方式:
Then i took found the size of the content inside the UiWebView, changed the UIWebView size according to the content size and then set the size of the scroll view to the size of the webview. This is how i did it by adding the following code in 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.
As i am using NSLog to see the size of the content of webview, i noticed that it gives different height for the same content. For example, if i open the view controller the first time, it shows the height equal to 915.0 and when i move back in the navigation and come back to this view controller, then the log will show the size to be 1012.0.
我相信这可能是由于 html 内容中加载了图像.谁能告诉我如何修复它以第一次显示正确的高度?谢谢!
I believe it might be due to the images loading in the html content. Can anybody tell how can i fix it to show the right height the first time? Thanks!
更新:如果我使用 javascript 使用不同的策略,我已经尝试使用以下代码:
UPDATE: If i use a different strategy using javascript, that i have already tried using the following code:
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 向上移动了一点,挡住了它上面的所有标签.我做错了什么以及如何解决它?谢谢!
This code gives me the right height every time in the log which is exactly i want but the whole webview is shifted a little upward blocking all the labels above it. Am i doing something wrong and how to fix it? Thanks!
推荐答案
当您尝试在 UIScrollView 中嵌入 UIWebView 和其他视图时,这是一个非常常见的问题.
This is a very common problem when you try to embed a UIWebView And Other views inside a UIScrollView.
解决方案 1:您已经解释了问题中的第一个解决方案.但是,此解决方案仅在 UIScrollView 内的 UIWebView 中仅涉及文本时才有效.如果有图像和 ajax 或任何此类延迟加载的内容,则此解决方案不会第一次为您提供正确的高度.
SOLUTION 1: You have already explained the first solution in your question. How ever this solution is only valid when there is only text involved in the UIWebView inside the UIScrollView. If there are images and ajax or any such thing that lazily loads, this solution won't give you the right height the first time.
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.它每次都能为您提供正确的高度,但您将面临我无法解决的奇怪问题.在您的情况下,您说整个视图向上移动了一点.
SOLUTION 2: The other solution is using javascript. It gives you the right height everytime but you will face weird issues that i am unable to troubleshoot. In your case, you said that the whole view is shifted a little updwards.
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,这就是我解决它的方法:
SOLUTION 3: The last solution is the one that worked for me and it will definitely solve your problem. It involves merging the code in the first two solutions i described. That is you will get the height using javascript as it gives the right height everytime and then use the rest of the code in the first solution and increment few points. Notice i added +125.0, this is how i solved it:
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;
希望这会有所帮助!
这篇关于UIWebView 没有完全加载,高度变化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:UIWebView 没有完全加载,高度变化
- Android viewpager检测滑动超出范围 2022-01-01
- MalformedJsonException:在第1行第1列路径中使用JsonReader.setLenient(True)接受格式错误的JSON 2022-01-01
- 使用自定义动画时在 iOS9 上忽略 edgesForExtendedLayout 2022-01-01
- Android - 拆分 Drawable 2022-01-01
- Android - 我如何找出用户有多少未读电子邮件? 2022-01-01
- 在测试浓缩咖啡时,Android设备不会在屏幕上启动活动 2022-01-01
- android 4中的android RadioButton问题 2022-01-01
- 用 Swift 实现 UITextFieldDelegate 2022-01-01
- 想使用ViewPager,无法识别android.support.*? 2022-01-01
- 如何检查发送到 Android 应用程序的 Firebase 消息的传递状态? 2022-01-01