如何计算tableView行高并将值传递给heightForRowAtIndexPath
How to calculate tableView row height and pass value to heightForRowAtIndexPath
我有一个带有自定义单元格的 tableView。
每个单元格都有不同的界面、元素。它们都有不同的尺寸。
每个单元格都有不同类型的元素及其数量。
所有这些元素都是动态创建的,所以我正在创建它们,制作它们的框架并添加为 subviews.
所以 heightForRowAtIndexPath 在 cellForRowAtIndexPath 之前执行的问题我正在创建行并构建其接口,我不知道如何将计算出的高度传递给 heightForRowAtIndexPath
如何计算行高 before 并将其值传递给 heightForRowIndexPath 以正确绘制我的 tableView?
您真的应该考虑继承 UITableViewCell 并在您的子类中添加您的自定义逻辑。
从那里开始,您将有以下选择:
在您的单元格中创建静态方法,该方法将接收绘制单元格所需的所有数据(例如 heithtForCellWithFirstString:secondString:accessoryImage 等)并使用字符串大小计算方法计算高度。在 heightForRowAtIndexPath.
中使用此方法
使用自动布局来布置单元格的子视图,然后将 table 视图的行高 属性 设置为 UITableViewAutomaticDimension。这样你就根本不需要 heightForRow 委托方法。有很多关于此的教程,例如:http://www.raywenderlich.com/87975/dynamic-table-view-cell-height-ios-8-swift
如果您的单元格视图真的非常复杂并且每个组件的高度都取决于数据源。您可以尝试在 heightForRowIndexPath
方法中创建视图,然后将创建的视图缓存到视图控制器中的字典中,并直接在 cellForRowAtIndexPath
中使用它。这样你只需要在用户滚动 table 时创建一次视图。如果数据源变化不是很频繁,您也可以在 heightForRowIndexPath
中重用缓存视图。
并且如果 table 视图有很多行,您应该 return 在 estimatedHeightForRowAtIndexPath
中的高度的近似值以加快视图控制器的加载过程。否则在加载 tableview 期间,它会尝试计算所有行的高度,这可能需要很多时间。
但我真的不认为你的手机会这么复杂。如果只有一些高度依赖数据源的UITextLabels,你可以简单地只计算标签的高度,然后将其添加到其他组件的固定高度。
- 尝试创建
UITableViewCell
的子类。
- 您创建的所有元素都放在
UIView
中,它放在一个单元格中。
- 创建三个
NSLayoutConstraint
,一个从 UIView.top
到单元格顶部,第二个从 UIView.bottom
到单元格底部,第三个 - [= 的高度14=].
- 在
tableViewController
的viewDidLoad
方法中设置行高为UITableViewAutomaticDimension
:
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.rowHeight = UITableViewAutomaticDimension
}
- 在 UITableViewCell 的子类中创建一个方法来计算单元格的高度并更改 NSLayoutConstraint,它设置单元格的高度。例如:
:
func adjustHeightOfInnerView() {
let height = 100
self.myInnerCellViewHeightConstraint.constant = height
self.contentView.setNeedsUpdateConstraints()
}
- 在方法
cellForRowAtIndexPath
中调用 adjustHeightOfTableview
:
:
func tableView (tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as! myTableViewCellSubclass
cell.adjustHeightOfTableview()
return cell
}
我有一个带有自定义单元格的 tableView。 每个单元格都有不同的界面、元素。它们都有不同的尺寸。 每个单元格都有不同类型的元素及其数量。 所有这些元素都是动态创建的,所以我正在创建它们,制作它们的框架并添加为 subviews.
所以 heightForRowAtIndexPath 在 cellForRowAtIndexPath 之前执行的问题我正在创建行并构建其接口,我不知道如何将计算出的高度传递给 heightForRowAtIndexPath
如何计算行高 before 并将其值传递给 heightForRowIndexPath 以正确绘制我的 tableView?
您真的应该考虑继承 UITableViewCell 并在您的子类中添加您的自定义逻辑。
从那里开始,您将有以下选择:
在您的单元格中创建静态方法,该方法将接收绘制单元格所需的所有数据(例如 heithtForCellWithFirstString:secondString:accessoryImage 等)并使用字符串大小计算方法计算高度。在 heightForRowAtIndexPath.
中使用此方法
使用自动布局来布置单元格的子视图,然后将 table 视图的行高 属性 设置为 UITableViewAutomaticDimension。这样你就根本不需要 heightForRow 委托方法。有很多关于此的教程,例如:http://www.raywenderlich.com/87975/dynamic-table-view-cell-height-ios-8-swift
如果您的单元格视图真的非常复杂并且每个组件的高度都取决于数据源。您可以尝试在 heightForRowIndexPath
方法中创建视图,然后将创建的视图缓存到视图控制器中的字典中,并直接在 cellForRowAtIndexPath
中使用它。这样你只需要在用户滚动 table 时创建一次视图。如果数据源变化不是很频繁,您也可以在 heightForRowIndexPath
中重用缓存视图。
并且如果 table 视图有很多行,您应该 return 在 estimatedHeightForRowAtIndexPath
中的高度的近似值以加快视图控制器的加载过程。否则在加载 tableview 期间,它会尝试计算所有行的高度,这可能需要很多时间。
但我真的不认为你的手机会这么复杂。如果只有一些高度依赖数据源的UITextLabels,你可以简单地只计算标签的高度,然后将其添加到其他组件的固定高度。
- 尝试创建
UITableViewCell
的子类。 - 您创建的所有元素都放在
UIView
中,它放在一个单元格中。 - 创建三个
NSLayoutConstraint
,一个从UIView.top
到单元格顶部,第二个从UIView.bottom
到单元格底部,第三个 - [= 的高度14=]. - 在
tableViewController
的viewDidLoad
方法中设置行高为UITableViewAutomaticDimension
:
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.rowHeight = UITableViewAutomaticDimension
}
- 在 UITableViewCell 的子类中创建一个方法来计算单元格的高度并更改 NSLayoutConstraint,它设置单元格的高度。例如:
:
func adjustHeightOfInnerView() {
let height = 100
self.myInnerCellViewHeightConstraint.constant = height
self.contentView.setNeedsUpdateConstraints()
}
- 在方法
cellForRowAtIndexPath
中调用adjustHeightOfTableview
:
:
func tableView (tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as! myTableViewCellSubclass
cell.adjustHeightOfTableview()
return cell
}