我正在 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]
),更改界面生成器中的属性......
如果我可以发布其他代码片段,请告诉我。在此先感谢您的帮助!