获得样式化的UIWebView内容的大小 - 不太合适

dea*_*_au 0 uiwebview ios

这似乎是一个常见问题,但我找不到合适的解决方案.我正在尝试重新调整一堆UIWebView以适应他们的内容,但它似乎无法正常工作.到目前为止,我发现的最佳解决方案是这个答案,但它似乎只是偶尔在我的解决方案中工作.我们的想法是在webViewDidFinishLoad:委托方法中重新调整UIWebView的大小.但是,这仍然无法获得正确的尺寸.如果我在引发一些不确定的时间更新后 webViewDidFinishLoad:,内容不会得到正确的大小.

我将在下面描述我的情况,我将在Gist上粘贴相关的来源.

问题描述

我有一种情况,我从JSON API获取数据并在webview中显示数据.API返回一个对象数组,每个对象都有一个带有HTML格式文本的"content"字段.设计师给出了一个结构,其中包含一个(大部分)隐藏视图,您可以向上滑动显示,其中包含所有内容的滚动视图,以非常特殊的方式格式化.

为了实现这一点,我有三个视图控制器:主视图控制器,在主视图控制器上向上滑动以显示的辅助视图控制器,以及从JSON API结果显示一个html格式内容项的三级视图控制器.
辅助视图控制器包含UIScrollView和一组第三视图控制器.每个第三视图控制器都包含一个UIWebView,用于显示HTML格式的内容,以及用于显示JSON对象的其他属性的标签.因为第三视图将显示在辅助视图中的UIScrollView内,所以需要重新调整第三视图的UIWebView以适合其内容并禁用用户交互以防止滚动视图中的滚动视图混乱场景.

使所有这些工作的过程如下:

  1. 首先,在主控制器ViewDidLoad上,加载并显示辅助视图和活动指示器,以便UI看起来不会冻结
  2. 接下来,从JSON API加载数据
  3. 当加载API的数据(通过委托通知)时,构造第三级视图控制器,从加载的数据中设置它们的属性并将它们添加到辅助控制器的列表中.
  4. 完成后,调用辅助控制器的设置方法.此方法循环遍历第三级控制器列表并依次调用其设置方法
  5. 每个三级控制器的设置方法设置标签的文本,并使用loadHTMLString:预定义的html文件的内容设置UIWebView 的内容,并替换JSON对象的内容.
  6. 在第三级控制器的webViewDidFinishLoad:委托方法上,使用此答案中的方法,根据内容大小重新调整Web视图的大小.
  7. 重新调整三级控制器视图的大小以适合Web视图并定位Web视图下方的任何标签
  8. 然后,三级控制器调用委托方法来通知辅助控制器它已完成加载.辅助控制器监视其三级控制器中的哪个已完成加载.
  9. 当所有三级控制器都完成加载时,辅助控制器循环遍历其列表并将第三视图添加到其UIScrollView的内容中,调整帧和内容高度.

小智 6

如果您使用的是iOS 5.0,则可以使用webview.scrollView.contentsize,否则您也可以通过javascript获取内容大小.

CGFloat newHeight = [[webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight;"] floatValue];
Run Code Online (Sandbox Code Playgroud)

或者

CGFloat newHeight = [[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.scrollHeight;"] floatValue];
Run Code Online (Sandbox Code Playgroud)