如何计算tableView行高并将值传递给heightForRowAtIndexPath

时间:2016-01-16 11:53:58

标签: ios swift height tableview custom-cell

我有自定义单元格的 tableView 。 每个单元格都有不同的界面元素。它们都有不同的尺寸。 每个单元格都有不同类型的元素及其数量。 所有这些元素都是动态创建的,因此我创建它们,制作框架并添加为子视图

所以 heightForRowAtIndexPath cellForRowAtIndexPath 之前执行的问题我在哪里创建行并构建其界面并且我不知道如何通过计算高度为 heightForRowAtIndexPath

如何在之前计算行高,并将的值传递给heightForRowIndexPath 以正确绘制tableView?

3 个答案:

答案 0 :(得分:3)

如果您的单元格视图非常复杂,并且每个组件的高度都取决于数据源。您可以尝试在heightForRowIndexPath方法中创建视图,然后将创建的视图缓存到视图控制器中的字典中,并直接在cellForRowAtIndexPath中使用它。这样,您只需在用户滚动表格时创建一次视图。如果数据源不经常更改,您也可以重用heightForRowIndexPath中的缓存视图。

如果tableview有很多行,你应该在estimatedHeightForRowAtIndexPath返回一个近似的高度值,以加快视图控制器的加载过程。否则在加载tableview期间,它会尝试计算所有行的高度,这可能需要很长时间。

但我真的不认为你的细胞会如此复杂。如果只有一些UITextLabel依赖于数据源的高度,你只需要计算标签的高度,然后将其添加到其他组件中。高度是固定的。

答案 1 :(得分:2)

你真的应该考虑继承UITableViewCell并在你的子类中添加你的自定义逻辑。

从那里开始,你会有这样的选择:

  1. 在单元格中创建静态方法,该方法将接收绘制单元格所需的所有数据(例如heithtForCellWithFirstString:secondString:accessoryImage等),并使用字符串大小计算方法计算高度。在heightForRowAtIndexPath中使用此方法。

  2. 使用autolayout布置单元格的子视图,然后将表格视图的行高属性设置为UITableViewAutomaticDimension。这样你根本不需要heightForRow委托方法。有很多关于此的教程,例如:http://www.raywenderlich.com/87975/dynamic-table-view-cell-height-ios-8-swift

答案 2 :(得分:0)

  1. 尝试创建UITableViewCell
  2. 的子类
  3. 您创建的所有元素都放在UIView内,放在一个单元格中。
  4. 创建三个NSLayoutConstraint,一个从UIView.top到单元格的顶部,第二个从UIView.bottom到单元格的底部,第三个 - {{1}的高度}。
  5. UIView viewDidLoad方法设置行高tableViewController
  6. UITableViewAutomaticDimension
    1. 在UITableViewCell的子类中创建一个方法,该方法将计算单元格的高度并更改NSLayoutConstraint,后者设置单元格的高度。例如:
    2. override func viewDidLoad() {
         super.viewDidLoad()
         self.tableView.rowHeight = UITableViewAutomaticDimension
      }
      
      1. 在方法func adjustHeightOfInnerView() { let height = 100 self.myInnerCellViewHeightConstraint.constant = height self.contentView.setNeedsUpdateConstraints() } 中调用cellForRowAtIndexPath
      2. adjustHeightOfTableview