我正在制作的应用中有聊天功能。每个单元格都有UITextView
,我需要计算每个单元格的**height and width**
。我这样做,然后缓存该数据。
使用NSLog我已确定数据已正确缓存,并且每行的高度仅被要求一次。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
Message *message = [feedItems objectAtIndex:indexPath.row];
NSString *reuseIdentifier;
if (message.iSentThisMessage) {
reuseIdentifier = @"MeCell";
} else {
reuseIdentifier = @"HostCell";
}
ChatTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier forIndexPath:indexPath];
// Configure the cell...
cell.textView.text = message.content;
if (message.frame.size.height == 0 && message.frame.size.width == 0) {
CGRect rect = cell.textView.frame;
rect.origin.x = 5;
rect.origin.y = 3;
CGSize size = [self text:message.content
sizeWithFont:[UIFont systemFontOfSize:17.0]
constrainedToSize:CGSizeMake(225.0, CGFLOAT_MAX)];
rect.size.height = size.height
+ cell.textView.textContainerInset.bottom
+ cell.textView.textContainerInset.top;
rect.size.width = [cell.textView sizeThatFits:CGSizeMake(225.0, rect.size.height)].width
+ cell.textView.textContainerInset.left
+ cell.textView.textContainerInset.right;
if (message.iSentThisMessage) {
rect.origin.x = 320 - (rect.origin.y + rect.size.width);
}
cell.textView.frame = rect;
message.frame = rect;
NSLog(@"Not Cached :(");
} else {
cell.textView.frame = message.frame;
NSLog(@"Cached!");
}
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
Message *message = [feedItems objectAtIndex:indexPath.row];
CGSize size = [self text:message.content
sizeWithFont:[UIFont systemFontOfSize:17.0]
constrainedToSize:CGSizeMake(225.0, CGFLOAT_MAX)];
if (indexPath.row + 1 == feedItems.count)
size.height += 4;
NSLog(@"Height asked for.");
return size.height + 12;
}
另外,另一种可能是我在自定义uitableviewcell
类中重写了以下方法,否则它会重新排列我单元格的内容。
- (void) layoutSublayersOfLayer:(CALayer *)layer {
}
我似乎无法弄清楚如何让它不滞后!!
答案 0 :(得分:0)
不清楚为什么使用文本视图,但如果可以,则应更改为标签。
另外,不要在表委托方法中缓存高度,这是一个讨厌的副作用。在加载/接收消息时,或在后台线程上计算批量加载时,预先计算高度。
文本视图/标签框架也应该相对于单元格,可以通过自动调整大小/布局。所以你永远不应该明确地设置它。
最重要的是 - 使用乐器的配置文件。这是唯一能真正告诉你错误的事情。