我正在尝试根据内容制作具有动态单元格高度的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
}
如我所见,当我运行它时,它的底部标签被切除了。
我通过接口断点来运行它,在那里您可以看到错误的原因:
如您从我的log语句中看到的,呈现的大小比sizeToFit()的估计大小大一个大小:
imageH: 297.25, titleH: 44.5 detailH: 56.5 totalH:398.25
我怀疑此计算错误的原因是由于我为heightForView函数提供了错误的width参数。我试图使用tableView.contentSize和许多其他东西。我的情节提要和代码中的lineBreakMode相同。
我想我需要的是一种更好的方法来找到期望的单元格宽度,或者其他任何可以给我合适的期望高度的解决方案。
编辑:约束:
最佳答案
自动尺寸
使用更少的代码(*),您可以完全放弃heightForRowAtIndexPath
,并使用autolayout
进行所有操作。
heightForRowAtIndexPath
(所有代码都会消失)viewDidLoad
中): self.tableView.estimatedRowHeight = 88
self.tableView.rowHeight = UITableViewAutomaticDimension
(*) 2行代码,准确地说。
通过比较2 lines solution和multiple methods override solution来说服自己。
保证金注释
XIB
和storyboard
:您可以控制约束及其与边距的关系。请注意,当使用“相对于边距”时,项目顺序很重要,因为边距通常是插图。
有关详细信息,请参见https://stackoverflow.com/a/25420909/218152。
storyboard
:您可以从 IB 中访问其他topLayoutGuide
和bottomLayoutGuide
属性,这对于您的视图控制器可能是有价值的,但对于UITableViewCell
而言是不在主题的。 关于ios - sizeToFit()返回错误的高度-需要在heightForRow中查找单元格宽度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34731721/