ios – 异步调整UITableViewCell与生成的UIView-Encapsulated-Layout-Height的大小

前端之家收集整理的这篇文章主要介绍了ios – 异步调整UITableViewCell与生成的UIView-Encapsulated-Layout-Height的大小前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用iOS 8调整桌面视图单元格,从而无法实现
  1. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

但使用:

  1. self.tableView.rowHeight = UITableViewAutomaticDimension;
  2. self.tableView.estimatedRowHeight = 200;

细胞具有从上至下的约束.

该单元格包含(其中包括)一个UIWebview,通过询问scrollview的高度来加载后异步知道其大小:

  1. CGFloat fittingHeight = self.messageTextWebView.scrollView.contentSize.height;

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

因为整个自动布局过程在这种情况下完成,我设置

  1. [self setNeedsUpdateConstraints];

在细胞中的观点,泡沫到细胞,并再次与layoutSubviews.

最后,我得到可怕的无法同时满足约束.打破一切的约束是

  1. "<NSLayoutConstraint:0x7f8c29d157f0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f8c2b063eb0(270)]>"

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

它杀死了我自己:

  1. Will attempt to recover by breaking constraint
  2. <NSLayoutConstraint:0x7fa8a8515b70 V:[UIView:0x7fa8aa0263e0(263)]>

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

什么令人沮丧:
如果我用简单的多行标签替换Web视图,并且在第一个单元格布局中知道所有的大小,一切都可以正常工作.网页视图的加载系统的异步性质,迫使我在第一次渲染单元格之后更改布局.

现在我的问题:

有没有办法解决?我真的不想重新加载单元格.如果单元格是屏幕上唯一的单元格,那么它不会被重复使用,整个事情将重新开始.
这甚至是可能的还是UITableView架构是否依赖于外部约束才能正确呈现?

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

  1. self.translatesAutoresizingMaskIntoConstraints = NO;

在单元本身上,导致具有0,0的大小的单元格和约束:

  1. "<NSLayoutConstraint:0x7f88506663a0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f8850648400(0)]>"

但它仍然在…

谢谢你的帮助.

BTW:我已经看过关于这件事的一切,包括
Using Auto Layout in UITableView for dynamic cell layouts & variable row heights

解决方法

这是一个UITableViewCell子类,用于管理UIWebView,并将UITableView集合的UITableViewAutomaticDimension正确调整其高度.

主要是为UIWebView高度维护一个NSLayoutConstraint.更新其在updateConstraints中的常量.当有变化时,告诉父表视图重新计算单元格高度.

  1. @implementation WebTableViewCell
  2. {
  3. IBOutlet UIWebView* _webview; // glued to cell content view using edge constraints
  4.  
  5. IBOutlet NSLayoutConstraint* _heightConstraint; // height constraint for the webview itself
  6. }
  7.  
  8. - (void) awakeFromNib
  9. {
  10. _webview.scrollView.scrollEnabled = NO;
  11.  
  12. // use this to test varIoUs document heights
  13. // [_webview loadHTMLString: @"<html><body style='height:100px;'>Hello,World</body></html>" baseURL: nil];
  14.  
  15. // or,a real web page
  16. [_webview loadRequest: [NSURLRequest requestWithURL: [NSURL URLWithString: @"https://stackoverflow.com/users/291788/tomswift"]]];
  17. }
  18.  
  19. - (void) updateConstraints
  20. {
  21. [super updateConstraints];
  22.  
  23. // get the document height.
  24. CGFloat height = [[_webview stringByEvaluatingJavaScriptFromString: @"document.height"] floatValue];
  25. if ( _heightConstraint.constant != height )
  26. {
  27. // update
  28. _heightConstraint.constant = height;
  29.  
  30. // ask the tableview to recalc heights
  31. dispatch_async(dispatch_get_main_queue(),^{
  32.  
  33. UITableView* tableView = (UITableView*)self.superview;
  34. while ( tableView != nil && ![tableView isKindOfClass: [UITableView class]] )
  35. tableView = (UITableView*)tableView.superview;
  36.  
  37.  
  38. [tableView beginUpdates];
  39. [tableView endUpdates];
  40. });
  41. }
  42. }
  43.  
  44. - (void) webViewDidFinishLoad:(UIWebView *)webView
  45. {
  46. [self setNeedsUpdateConstraints];
  47. }
  48.  
  49. @end

猜你在找的iOS相关文章