异步调整UITableViewCell与生成的UIView-Encapsulated-Layout-Height

k1t*_*1th 10 constraints uitableview ios autolayout ios8

我正在尝试使用iOS 8"从内部"调整表格视图单元格,因此无法实现

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
Run Code Online (Sandbox Code Playgroud)

但使用:

self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 200;
Run Code Online (Sandbox Code Playgroud)

细胞从上到下有限制.

该单元格包含(除其他外)一个UIWebview,它通过询问scrollview的高度,在加载后异步地知道它的大小:

CGFloat fittingHeight = self.messageTextWebView.scrollView.contentSize.height;
Run Code Online (Sandbox Code Playgroud)

(这是一种变体,其中webview包含在另一个视图中,并且该视图相应地调整大小).

因为当这发生时整个自动布局过程完成,我设置

[self setNeedsUpdateConstraints];
Run Code Online (Sandbox Code Playgroud)

在单元格中的视图中,它向着细胞起泡并再次下降layoutSubviews.

最后,我得到了可怕的Unable to simultaneously satisfy constraints..打破一切的约束是

"<NSLayoutConstraint:0x7f8c29d157f0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f8c2b063eb0(270)]>"
Run Code Online (Sandbox Code Playgroud)

当第一次计算单元格时,由表视图创建此约束.

它杀死了我自己:

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7fa8a8515b70 V:[UIView:0x7fa8aa0263e0(263)]>
Run Code Online (Sandbox Code Playgroud)

虽然我将约束的优先级设置为1000,将压缩阻力设置为1000,但我无法覆盖表视图创建的约束.

令人沮丧的是:如果我用简单的多线标签替换网页视图并在第一个单元格布局中了解所有尺寸,那么一切都很完美.这是Web视图加载系统的异步特性,它迫使我在第一次呈现单元格后更改布局.

现在我的问题:

有没有办法解决?我真的不想重新加载单元格.如果单元格是屏幕上唯一的单元格,则不会重复使用,整个过程会重新开始.这甚至是可能的还是UITableView架构依赖于外部约束来正确渲染自身?

只是为了它的乐趣,我设置

self.translatesAutoresizingMaskIntoConstraints = NO;
Run Code Online (Sandbox Code Playgroud)

在单元格本身上,导致一个大小为0,0的单元格和约束:

"<NSLayoutConstraint:0x7f88506663a0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f8850648400(0)]>"
Run Code Online (Sandbox Code Playgroud)

但它还在那里......

谢谢你的帮助.

顺便说一句:我已经阅读了有关此事的所有内容,包括: 在UITableView中使用自动布局进行动态单元格布局和可变行高

k1t*_*1th 1

经过更多研究,我的结论是:

\n\n

使用现在允许 HTML 内容的属性字符串(自 iOS7 起):

\n\n
[[NSAttributedString alloc] initWithData:[message dataUsingEncoding:NSUTF8StringEncoding]\noptions:\n@{\n     NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType,\n     NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding] \n} \ndocumentAttributes:nil error:&err];\n
Run Code Online (Sandbox Code Playgroud)\n\n

HTML 解析器没问题,但有限制

\n\n
    \n
  • 应该使用 src 标签来引用网络上的内容。内容在主线程上加载。我认为他们必须这样做才能强制同步渲染。
  • \n
  • 没有交互(这实际上是一件好事)。
  • \n
\n\n

或者: \n集合视图可能有效,但我还没有转换表视图 - 根据我使用 NSAttributedString 的测试结果,我可能会跳过它...

\n\n

更新

\n\n

我尝试使用很棒的https://github.com/TTTAttributedLabel/TTTAttributedLabel \n它呈现属性字符串,并具有检测链接的额外好处。这就是我几乎需要的一切 \xe2\x80\x93\xc2\xa0。\n它不渲染标签...

\n\n

回到 UITextView ,令人惊讶的是它工作得很好。

\n