具有动态单元格高度的UITableView - 我需要做些什么来修复向下滚动?

时间:2009-03-25 02:56:56

标签: iphone objective-c uitableview

我正在iPhone上建立一个小小的Twitter小客户端。当然,我在UITableView中显示推文,它们当然有不同的长度。我根据文字动态地改变了单元格的高度:

- (CGFloat)heightForTweetCellWithString:(NSString *)text {
  CGFloat height = Buffer + [text sizeWithFont:Font constrainedToSize:Size lineBreakMode:LineBreakMode].height;
  return MAX(height, MinHeight);
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  NSString *text = // get tweet text for this indexpath
    return [self heightForTweetCellWithString:text];
  }
}

我正在使用PragProg书中的算法显示实际的推文单元格:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  static NSString *CellIdentifier = @"TweetCell";
  TweetCell *cell = (TweetCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) {
    cell = [self createNewTweetCellFromNib];
  }
  cell.tweet.text = // tweet text
  // set other labels, etc
  return cell;
}

当我启动时,所有可见的推文都显示得很好。然而,当我向下滚动时,下面的推文已经完全拼凑起来 - 看起来一旦一个单元格从屏幕上滚动,它上面的单元格的单元格高度就会大于它应该的大小,并且模糊了部分它下面的细胞。当单元格到达视图的顶部时,它会自行重置并正确渲染。向上滚动没有任何困难。

以下视频展示了这一点:http://screencast.com/t/rqwD9tpdltd

我已经尝试了很多:在创建时调整单元格的大小,为不同高度的单元格使用不同的标识符(即[NSString stringWithFormat:@"Identifier%d", rowHeight]),在Interface Builder中更改属性...

如果我可以发布其他代码段,请告诉我们。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:8)

叹息。事实证明,我并没有很好地调整所有属性。但至少我摆脱了这个bug。 :)

通过确保检查UITableViewCell的{​​{3}}属性来解决此问题。

这种行为是由于我的推文文本标签声明为必要的最大高度 - 当表格单元格的子视图没有被剪裁时,上面单元格中的标签会超出下面的单元格。由于SDK呈现单元格的顺序 - 向下 - 以及它如何将每个单元格堆叠在另一个之上,因此在第一次渲染屏幕时不可见。