【发布时间】:2012-07-25 00:49:03
【问题描述】:
这似乎是一个常见问题,但我找不到合适的解决方案。我正在尝试重新调整一堆 UIWebView 的大小以适应它们的内容,但它似乎无法正常工作。到目前为止,我发现的最佳解决方案是 this answer,但它似乎只是偶尔在我的解决方案中起作用。这个想法是在webViewDidFinishLoad: 委托方法中重新调整 UIWebView 的大小。但是,这仍然没有得到正确的尺寸。如果我在某个未定义的时间触发更新之后 webViewDidFinishLoad:,内容的大小确实正确。
我将在下面描述我的情况,并将相关来源粘贴到Gist。
问题描述
我有一种情况,我从 JSON API 获取数据并在 web 视图中显示数据。 API 返回一个对象数组,每个对象都有一个带有 HTML 格式文本的“内容”字段。设计师给出了一个结构,其中包含一个(大部分)隐藏视图,您可以向上滑动以显示该视图,其中包含所有内容的滚动视图,以非常特殊的方式格式化。
为了实现这一点,我有三个视图控制器:主视图控制器、在主视图控制器上向上滑动以显示的辅助视图控制器,以及显示来自JSON API 结果。
二级视图控制器包含一个 UIScrollView 和一个三级视图控制器数组。每个第三视图控制器都包含一个 UIWebView 以显示 HTML 格式的内容,以及用于显示 JSON 对象的其他属性的标签。因为第三视图将显示在第二视图的 UIScrollView 内,所以第三视图的 UIWebView 需要重新调整大小以适应其内容并禁用用户交互,以防止混淆滚动视图中的滚动视图场景。
让所有这些工作的过程如下:
- 首先,在主控制器 ViewDidLoad 上,加载并显示辅助视图 和一个活动指示器,因此 UI 似乎不会冻结
- 接下来,从 JSON API 加载数据
- 当来自 API 的数据已加载(通过委托通知)时,构造第三 查看控制器,从加载的数据中设置它们的属性并将它们添加到辅助 控制器列表。
- 完成后,调用辅助控制器的设置方法。这个方法循环 通过三级控制器列表并依次调用它们的设置方法
- 每个第三控制器的设置方法设置标签的文本并设置
UIWebView 的内容使用
loadHTMLString:和预定义的 html 文件的内容, 替换为 JSON 对象的内容。 - 在第三级控制器的
webViewDidFinishLoad:委托方法上,使用 this answer 的方法,根据内容大小重新调整 Web 视图的大小。 - 重新调整第三级控制器视图的大小以适合 Web 视图并放置任何标签 进入网络视图下方
- 然后三级控制器调用委托方法通知二级控制器 它已经完成加载。辅助控制器密切关注其哪个 三级控制器已完成加载。
- 当所有第三控制器都完成加载后,第二控制器循环 通过它的列表并将第三视图添加到它的 UIScrollView 的内容中,调整 框架和内容高度。
【问题讨论】: