我使用表格视图覆盖heightForRowAtIndexPath
。当我运行Xcode探查器时,我发现了以下内容:
我想根据一个对象的属性计算高度。我对两种对象User
和Post
使用相同的表格视图。我的实现目前看起来像这样:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *text;
Post *cellPost;
User *cellUser;
if (_pageType == FOLLOWERS || _pageType == FOLLOWING) {
cellUser = [self.users objectAtIndex:indexPath.row];
text = cellUser.userDescription.text;
if (text == nil) {
return 70;
}
} else {
cellPost = [self.fetchedResultsController objectAtIndexPath:indexPath];
text = cellPost.text;
}
CGSize boundingSize = CGSizeMake(245, CGFLOAT_MAX);
CGSize requiredSize = [text sizeWithFont:[UIFont fontWithName:@"TisaMobiPro" size:15]
constrainedToSize:boundingSize
lineBreakMode:NSLineBreakByWordWrapping];
CGFloat textHeight = requiredSize.height;
CGFloat cellHeight = textHeight + 40;
if ([cellPost.text isEqualToString:self.post.text]) {
cellHeight += 44;
if (cellHeight < 114) {
cellHeight = 114;
}
} else {
if (cellHeight < 70) {
cellHeight = 70;
}
}
if (cellPost.repostedBy != nil && cellPost.youReposted.boolValue == NO && _pageType != CONVERSATION) {
cellHeight += 27;
}
return cellHeight;
}
如果我删除大部分代码并且只有,例如return 100
tableView的滚动性能得到了很大改善。您是否可以发现或植入可能导致此性能问题的植入物的建议?
答案 0 :(得分:1)
如果您定位到iOS7,则可以使用NSTableView
属性:estimatedRowHeight
。
来自Apple文档:
提供行高的非负估计可以改善行 加载表视图的性能。如果表包含变量 高度行,计算所有高度时可能会很昂贵 桌子加载。使用估算可以让您推迟一些成本 从加载时间到滚动时间的几何计算。
另外:
每次都是 显示表视图,它调用tableView:heightForRowAtIndexPath: 在每行
的委托上
如果你必须使用tableView:heightForRowAtIndexPath:
缓存高度,就像@Waine建议的那样。
答案 1 :(得分:1)
在调用– tableView:cellForRowAtIndexPath:
之前和所有单元格数量之前计算高度。
如果您在iOS7上进行部署,则可以使用- tableView:estimatedHeightForRowAtIndexPath:
,使用该方法可以在滚动tableview时推迟此计算。这意味着基本上在显示单元格时调用方法tableView:heightForRowAtIndexPath:
。估计值可能是接近TVC平均值的固定数字,或者基于某些数学运算速度快于您实施的数字
由于估计,电视可以将其内容大小设置为滚动条高度,并且不需要在一次拍摄中计算100行的每个高度。由于电视正在计算实际的行高,因此回滚可能是滚动期间的延迟。