之前写过一篇它的文章了。不过那个是单纯的demo,这次有个页面又要高度自适应,就重新看了看,再次用它实现高度自适应。第三方的库就不用了。
首先,cell高度的不一样,都是由cell中label文字的不确定造成的,才产生了cell高度自适应这个问题。因此,label是关键。
以前解决cell高度问题,是根据label内容先计算label,然后再加上其他的固定高度,返回给代理方法,或者首先计算完所有高度,放到一个数组里,然后直接返回,总共计算一次就行了。不用没返回一次计算一次。这种办法没啥大问题。不过既然系统给了cell高度的计算办法,肯定比自己主动计算效率高。
这个方法就是systemLayoutSizeFittingSize。
注意:systemLayoutSizeFittingSize这个方法是cell.contentView调动,返回的contentView的size,所以最后+1,分割线的高度。
并且必须有实例对象调用,所以做一个全局变量self.temCell,不用每次调用都新建cell对象。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
// 模拟的数据
if (indexPath.row % 2) {
self.temCell.contentLab.text = @"我们睡觉族自然也没闲着,每天早晨从中午开始,当一天和尚撞一天钟或者干脆连钟都不撞。上厕所、吃饭,看NBA、打篮球,上网、约会;各有各的一份事做。天天如此,日子也就在这些单调无聊的事情中被消耗。回过头来看看强哥,那才真叫一个收获满满。拿到了国家英语四六级证书,计算机二级证书,普通话一级乙等证书等各类证书,国家奖学金,以及保送研究生的资格。";
}else{
self.temCell.contentLab.text = @"除了这些能看得到的收获,强哥还有一件更牛逼的本领,那就是精通计算机。组装,修理,装系统,制作表格,处理照片,以及各类软件,均不在话下。因此,他想找份工作,易如反掌因此";
}
// 先确定label的最大宽度,根据自己需求确定宽度
CGFloat preMaxWaith = SCREENWIDTH - 96;
[self.temCell.contentLab setPreferredMaxLayoutWidth:preMaxWaith];
// 直接返回cellsize,最后+1,是cell分割线的高度
CGSize cellSize = [self.temCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
return cellSize.height + 1;
}
效果如图
PS: 多个label的情况,有空接着试试。