19

我正在 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]),更改界面生成器中的属性......

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

4

1 回答 1

8

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

通过确保检查.UITableViewCell

该行为是由于将我的推文文本标签声明为必要的最大高度而引起的——当表格单元格的子视图未被裁剪时,上方单元格中的标签将呈现在下方单元格的上方。由于 SDK 呈现单元格的顺序(向下)以及它如何将每个单元格堆叠在另一个之上,这在屏幕的第一次渲染时不可见。

于 2009-03-25T03:30:12.863 回答