我有自定义单元格的 tableView 。 每个单元格都有不同的界面元素。它们都有不同的尺寸。 每个单元格都有不同类型的元素及其数量。 所有这些元素都是动态创建的,因此我创建它们,制作框架并添加为子视图。
所以 heightForRowAtIndexPath 在 cellForRowAtIndexPath 之前执行的问题我在哪里创建行并构建其界面并且我不知道如何通过计算高度为 heightForRowAtIndexPath
如何在之前计算行高,并将的值传递给heightForRowIndexPath 以正确绘制tableView?
答案 0 :(得分:3)
如果您的单元格视图非常复杂,并且每个组件的高度都取决于数据源。您可以尝试在heightForRowIndexPath
方法中创建视图,然后将创建的视图缓存到视图控制器中的字典中,并直接在cellForRowAtIndexPath
中使用它。这样,您只需在用户滚动表格时创建一次视图。如果数据源不经常更改,您也可以重用heightForRowIndexPath
中的缓存视图。
如果tableview有很多行,你应该在estimatedHeightForRowAtIndexPath
返回一个近似的高度值,以加快视图控制器的加载过程。否则在加载tableview期间,它会尝试计算所有行的高度,这可能需要很长时间。
但我真的不认为你的细胞会如此复杂。如果只有一些UITextLabel依赖于数据源的高度,你只需要计算标签的高度,然后将其添加到其他组件中。高度是固定的。
答案 1 :(得分:2)
你真的应该考虑继承UITableViewCell并在你的子类中添加你的自定义逻辑。
从那里开始,你会有这样的选择:
在单元格中创建静态方法,该方法将接收绘制单元格所需的所有数据(例如heithtForCellWithFirstString:secondString:accessoryImage等),并使用字符串大小计算方法计算高度。在heightForRowAtIndexPath中使用此方法。
使用autolayout布置单元格的子视图,然后将表格视图的行高属性设置为UITableViewAutomaticDimension。这样你根本不需要heightForRow委托方法。有很多关于此的教程,例如:http://www.raywenderlich.com/87975/dynamic-table-view-cell-height-ios-8-swift
答案 2 :(得分:0)
UITableViewCell
。UIView
内,放在一个单元格中。NSLayoutConstraint
,一个从UIView.top
到单元格的顶部,第二个从UIView.bottom
到单元格的底部,第三个 - {{1}的高度}。UIView
viewDidLoad
方法设置行高tableViewController
UITableViewAutomaticDimension
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.rowHeight = UITableViewAutomaticDimension
}
func adjustHeightOfInnerView() {
let height = 100
self.myInnerCellViewHeightConstraint.constant = height
self.contentView.setNeedsUpdateConstraints()
}
中调用cellForRowAtIndexPath
:
adjustHeightOfTableview