【问题标题】:iOS - load UIWebView content synchronously?iOS - 同步加载 UIWebView 内容?
【发布时间】:2011-10-20 03:12:31
【问题描述】:

我有一个包含很多行的 UITableView,每行包含一个 UIWebView。这个webView的内容存储在我的数据库中(在app上),tableView中每个单元格的高度是根据我的UIWebView的滚动高度来计算的。

问题出在这里,loadHtmlString 方法是异步工作的,所以当 UITableView get 的heighForRowAtIndexPath 方法被调用时,数据还没有加载到 UIWebView 中(因为它是异步工​​作的)。所以我无法计算单元格所需的高度。

那么问题来了,是否可以同步加载 UIWebView 的内容?我的 html 文本很短,所以同步加载它应该不会花那么长时间。

编辑: 是否可以在不将其放在 UIWebView 中的情况下计算 html 字符串的预期高度,我知道这可以使用纯文本,我不知道 html

【问题讨论】:

  • 您可以预先计算高度并将其包含在数据库中吗?
  • 作为最后的手段,您可以使用全局标志阻止线程直到它被加载。
  • @MattH 是的,我考虑过,但我宁愿不在我的数据库中存储 UI 信息。
  • 如何从 $(document).ready() 函数回调到 ObjC 应用程序,基本上告诉它继续计算高度?
  • @MattH 回调不起作用,因为它可能会在单元格的高度被询问后返回

标签: iphone ios uitableview uiwebview


【解决方案1】:

你可以:

1) 在第一次 heighForRowAtIndexPath 调用时返回默认高度

2) 加载您的 HTML

3) 等待事件 webViewDidFinishLoad 并将最终高度存储在数组中

  - (void)webViewDidFinishLoad:(UIWebView *)webView

4) 通过调用更新单元格高度

  [self.tableView beginUpdates];
  [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
  [self.tableView endUpdates];

5) 返回调用heighForRowAtIndexPath时的最终高度

【讨论】:

  • +1,但如果UIWebViews 启用了scalesPageToFit,您会遇到一些有趣的自动调整大小问题。
  • 我试过这个,问题是当你快速滚动一堆单元格时。
  • aryaxt,快速滚动的结果是什么?
  • 我看到很多奇怪的调整大小,因为它重用了单元格。并且它使用的单元格可能有一个意外的高度,一旦 webView 回调它就会动画到正确的大小。
  • 我会将此标记为最佳答案,因为它最接近我想要完成的任务。我最终创建了自定义 UIView 并将它们存储在一个数组中,然后根据需要将它们插入到 UITableViewCells 中。就性能而言,这可能不是解决此问题的最佳方法,但它是在这种情况下工作的最佳解决方案。
【解决方案2】:

如果您拥有的 html 很短,为什么不将一些内联 CSS 放入其中显式设置文档 bodyheight 参数,然后在将其加载到 UIWebView 之前解析该值?

【讨论】:

  • 您没有指定它是动态的。据我所知,您只是存储 HTML 格式的文本以保留颜色等。我并没有说这是最好的解决方案,但它是简短的静态 HTML 代码的快速解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
相关资源
最近更新 更多