标签:
1.iOS8之后利用storyBoard或者xib自定义不等高cell:
对比自定义等高cell,需要几个额外的步骤(iOS8开始才支持)
// 以下两行代码就被苹果成为self0sizing技术,可惜只能在iOS8及其之后应用 // 告诉tableView所有cell的真实高度是自动计算(根据设置的约束来计算) self.tableView.rowHeight = UITableViewAutomaticDimension; // 告诉tableView所有cell的估算高度 self.tableView.estimatedRowHeight = 44;
2.iOS8之前利用storyBoard或者xib自定义不等高cell:
- (void)awakeFromNib { // 手动设置文字的最大宽度(目的是:让label知道自己文字的最大宽度,进而能够计算出自己的frame) self.text_label.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 20; }
- (void)viewDidLoad { [super viewDidLoad]; // 告诉tableView所有cell的估算高度(设置了估算高度,就可以减少tableView:heightForRowAtIndexPath:方法的调用次数) self.tableView.estimatedRowHeight = 200; }
估算高度的作用:因为tableView继承自UIScrollView,所以tableView需要根据cell的高度来计算出contentSize。如果不设置估算高度,程序启动,首先会调用多次heightForRowAtIndexPath:方法(该次数等于数据模型的count)。但如果设置了估算高度,程序会根据给定的估算高度计算出contentSize(计算方法是:估算高度 * 数据模型的count)。只有cell显示的时候才会调用heightForRowAtIndexPath:方法计算cell的真实高度,这样一来,heightForRowAtIndexPath:方法的调用次数大大降低,同时也大大提高了性能。
- (CGFloat)height
{
// 强制布局cell内部的所有子控件(label根据文字多少计算出自己最真实的尺寸)
[self layoutIfNeeded];
// 计算cell的高度
if (self.status.picture) {
return CGRectGetMaxY(self.pictureImageView.frame) + 10;
} else {
return CGRectGetMaxY(self.text_label.frame) + 10;
}
}
XMGStatusCell *cell; - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // 创建一个cell(cell的作用:根据模型数据布局所有的子控件,进而计算出cell的高度,但是因为这个cell不会显示,所以需要手动设置cell中label的最大宽度) // cell的作用只是为了计算并返回cell的高度,而不是为了返回cell,所以这个cell是打酱油的,这个cell不会被显示在tableView上,既然也不会被回收到tableView的缓存池(因为只有曾经显示到tableView并且已经离开屏幕的cell才会被回收到缓存池) if (!cell) { cell = [tableView dequeueReusableCellWithIdentifier:ID]; } // 设置模型数据 cell.status = self.statuses[indexPath.row]; return cell.height; }
自定义不等高cell—storyBoard或xib自定义不等高cell
标签:
原文地址:http://www.cnblogs.com/wsnb/p/4856600.html