sizeToFit()返回错误的高度 – 需要在heightForRow中查找单元格宽度

我正在尝试使用dynamic单元格高度制作一个基于内容的UITableView。 我的应用程序是文章查看器。 我尝试用这些函数来计算单元格的高度。

func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{ let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max)) label.numberOfLines = 0 label.lineBreakMode = .ByTruncatingTail label.font = font label.text = text label.sizeToFit() return label.frame.height } override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { let post = FeedController.sharedController.allPosts[indexPath.row] var height = 16.0 if post.hasImage { height += Double(self.view.frame.width) / (4/3) } let titleH = heightForView(post.title!, font: UIFont(name: "LiberationSerif-Bold", size: 20.0)!, width: self.tableView.bounds.width) let descH = heightForView(post.desc!, font: UIFont(name: "LiberationSerif", size: 17.0)!, width: self.tableView.bounds.width) let totalHeight = CGFloat(height+Double(titleH)+Double(descH)) print("imageH: \(height), titleH: \(titleH) detailH: \(descH) totalH:\(totalHeight)") return totalHeight } 

当我运行它,看起来像这样,你可以看到,底部标签被切断。

在这里输入图像说明

我运行它通过接口断点thingy,在那里你可以看到错误的原因:

在这里输入图像说明

呈现的大小比sizeToFit()的估计大小大一倍,正如您从日志语句中看到的那样:

 imageH: 297.25, titleH: 44.5 detailH: 56.5 totalH:398.25 

我怀疑这个计算错误的原因是由于我提供了widthForView函数与错误的宽度参数。 我试图使用tableView.contentSize,和许多其他的东西。 lineBreakMode在我的故事板和我的代码中是一样的。

我想我所需要的是更好的方法来find细胞的预期宽度,或任何其他解决scheme,这将给我适当的预期高度。


编辑:约束: 在这里输入图像说明

自动尺寸

用less得多的代码(*),你可以完全沟通heightForRowAtIndexPath ,并使用自动autolayout的一切。

  1. 不要覆盖heightForRowAtIndexPath (所有的代码消失)
  2. 告诉表视图做的辛苦工作(例如在viewDidLoad ):
  self.tableView.estimatedRowHeight = 88 self.tableView.rowHeight = UITableViewAutomaticDimension 

(*) 2行代码,确切地说。 通过比较2线解决scheme与多种方法覆盖解决scheme来说服自己。


保证金说明

  • XIBstoryboard :您可以控制约束及其与边距的关系。
    请注意,使用相对于保证金时 ,项目顺序很重要,因为保证金通常是插入的。 有关详细信息,请参阅https://stackoverflow.com/a/25420909/218152

  • storyboard :您可以从IB访问额外的topLayoutGuidebottomLayoutGuide属性,这对您的视图控制器来说可能是有价值的,但是对于您的UITableViewCell是偏离主题的。