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
的一切。
- 不要覆盖
heightForRowAtIndexPath
(所有的代码消失) - 告诉表视图做的辛苦工作(例如在
viewDidLoad
):
self.tableView.estimatedRowHeight = 88 self.tableView.rowHeight = UITableViewAutomaticDimension
(*) 2行代码,确切地说。 通过比较2线解决scheme与多种方法覆盖解决scheme来说服自己。
保证金说明
-
XIB
和storyboard
:您可以控制约束及其与边距的关系。
请注意,使用相对于保证金时 ,项目顺序很重要,因为保证金通常是插入的。 有关详细信息,请参阅https://stackoverflow.com/a/25420909/218152 。 -
storyboard
:您可以从IB访问额外的topLayoutGuide
和bottomLayoutGuide
属性,这对您的视图控制器来说可能是有价值的,但是对于您的UITableViewCell
是偏离主题的。
- Swift 3中的刮刮卡效果
- 在滚动视图中基于平移手势移动视图控制器
- Firebase iOS Swift致命错误:NSArray元素无法与Swift数组元素types匹配
- Error“Thread 1:EXC_BAD_INSTRUCTION(code = EXC_I386_INVOP,subcode = 0x0)”是什么意思?
- Facebook和Twitter分享错误Swift
- 使用Swift和Storyboard在两个UIViewControllers之间传递数据
- 将框架/边界/约束从一个视图复制到另一个视图
- 安装了CocoaPod,但没有看到Swift代码
- Swift 2.0“意想不到的结尾”错误与懒惰无功分配