我正在尝试根据内容制作具有动态单元格高度的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
}

如我所见,当我运行它时,它的底部标签被切除了。

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

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

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

如您从我的log语句中看到的,呈现的大小比sizeToFit()的估计大小大一个大小:
imageH: 297.25, titleH: 44.5 detailH: 56.5 totalH:398.25

我怀疑此计算错误的原因是由于我为heightForView函数提供了错误的width参数。我试图使用tableView.contentSize和许多其他东西。我的情节提要和代码中的lineBreakMode相同。

我想我需要的是一种更好的方法来找到期望的单元格宽度,或者其他任何可以给我合适的期望高度的解决方案。

编辑:约束:
ios - sizeToFit()返回错误的高度-需要在heightForRow中查找单元格宽度-LMLPHP

最佳答案

自动尺寸

使用更少的代码(*),您可以完全放弃heightForRowAtIndexPath,并使用autolayout进行所有操作。

  • 不要覆盖heightForRowAtIndexPath(所有代码都会消失)
  • 告诉表视图进行艰苦的工作(例如,在viewDidLoad中):

  •     self.tableView.estimatedRowHeight = 88
        self.tableView.rowHeight = UITableViewAutomaticDimension
    

    (*) 2行代码,准确地说。
    通过比较2 lines solutionmultiple methods override solution来说服自己。

    保证金注释
  • XIBstoryboard:您可以控制约束及其与边距的关系。
    请注意,当使用“相对于边距”时,项目顺序很重要,因为边距通常是插图。
    有关详细信息,请参见https://stackoverflow.com/a/25420909/218152
  • storyboard:您可以从 IB 中访问其他topLayoutGuidebottomLayoutGuide属性,这对于您的视图控制器可能是有价值的,但对于UITableViewCell而言是不在主题的。
  • 关于ios - sizeToFit()返回错误的高度-需要在heightForRow中查找单元格宽度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34731721/

    10-11 20:17
    查看更多