iOS8实现具有动态高度的heightForRowAtIndexPath

时间:2015-01-31 01:39:10

标签: ios uitableview swift

长话短说,iOS8有UITableViewAutomaticDimension

的错误

所以,你不能只调用你的tableView.rowHeight = UITableViewAutomaticDimension后跟estimatedRowHeight,因为当你重新加载数据时,你最终会变得非常跳跃,看起来很奇怪。

缓解此问题的方法显然是返回func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat

中单元格的高度

由于您无法在cellForRowatIndexPath:中拨打heightForRowAtIndexPath:,我基本上将我的cellForRowAtIndexPath复制到另一种方法中并将其更改为高度。我似乎无法让它工作,因为我的UILabel(在单元格中具有动态高度的那个)符合一行而只是截断而不是继续x行,直到显示所有内容。

注意,postBody是具有动态高度的文本。

我的cellForRowAtIndexPath:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell: UITableViewCell = self.feed.dequeueReusableCellWithIdentifier("post") as UITableViewCell

    var userName = cell.viewWithTag(1)! as UILabel
    var timestamp = cell.viewWithTag(2)! as UILabel
    var postBody = cell.viewWithTag(5)! as UILabel

    var post = self.posts[indexPath.row]

    userName.text = post.name
    timestamp.text = post.timestamp
    postBody.text = post.body

    return cell
}

my heightForRowAtIndexPath:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

    var cell: UITableViewCell = self.feed.dequeueReusableCellWithIdentifier("post") as UITableViewCell

    var userName = cell.viewWithTag(1)! as UILabel
    var timestamp = cell.viewWithTag(2)! as UILabel
    var postBody = cell.viewWithTag(5)! as UILabel

    var post = self.posts[indexPath.row]

    userName.text = post.name
    timestamp.text = post.timestamp
    postBody.text = post.body

    cell.setNeedsLayout()
    cell.layoutIfNeeded()

    return cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
}

为什么不起作用?使用UITableViewAutomaticDimension,我得到它的工作,并符合我通过自动布局的约束,但无法在这里得到它。

1 个答案:

答案 0 :(得分:0)

  1. 您描述的跳跃式滚动不是一个错误 - 它的发生是因为您估计的高度不足以接近您的实际高度。
  2. 不要使用heightForRowAtIndexPath方法将单元格取消。基本上,由于您正在使用它进行高度计算,因此您将一个永远不会显示的单元格出列。
  3. 您有几个选择:

    • 改善您的估计身高预测。
    • heightForRowAtIndexPath中,您可以使用自动布局来计算实际高度,方法是创建一个不会从表格视图中出列的单元格实例。你可以这样做:
      • 以编程方式创建单元格
      • .xib
      • 中创建您的单元格
      • 复制整个视图控制器并以编程方式从中提取一个单元格
      • 在故事板中复制您的单元格,然后extracting it via a property