
Autolayout自iOS6开始引入,到现在基本上也没什么坑了,就算有,前辈们也都填好了( ⁼̴̀ .̫ ⁼̴́ )✧
我理解的自动计算cell高度,有两个注意点:
第一: 设置tableView.estimatedRowHeight
self.tableView.estimatedRowHeight = 20
第二: 设置约束,保证cell的contentView的高度可以根据子控件算出来
例如以下只有一个label填充的cell(cell的结构->cell--contentView--label)
只需要给label添加以下约束:
cell就可以自动计算自己的高度
下面的是我的想法过程,大家可以略过:
一开始的时候想的是给label一个高度小于等于120的约束,并且持有它
make.height.lessThanOrEqualTo(@120)
折叠的时候,把约束install,展开的时候uninstall。
实现起来:每次在TableView的cell点击代理方法里面 调用cell的方法使label高度的约束install和uninstall,然后调用 [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]
后来发现和这个约束有冲突
make.bottom.equalTo(_contentLabel.superview.mas_bottom).with.offset(-20) ,作为强迫症患者这能忍?。
然后突然想到label的numberOfLines可以限制行数......这不就是现成的实现折叠/展开的最好方法吗...
test-autolayoutcell
1. Masonry
2. 优化UITableViewCell高度计算的那些事
3. iOS7和iOS8下的自适应cell
设置cell动态高度有好几种方法:1.使用SDAutoLayout: http://blog.csdn.net/gsd_ios/article/details/50219713
2.使用Masonry: http://www.jianshu.com/p/3fc1b14e3f97
3.使用UITableView+FDTemplateLayoutCell.h 参考地址同上。
4.添加一个SampleCell用来计算高度: http://blog.csdn.net/horisea/article/details/52025886
我选了最后一种方法,原因是我的cell不是完全AutoLayout。最后一种方法自定义程度比较高。理解一下第四种方法,其实就是要先用一种方法根据数据Model计算出cell高度,然后渲染出cell视图。并将高度存储在数组中,方便使用,省略重复计算。
controller中:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
CGFloat height = [[self.heightArray h_safeObjectAtIndex:indexPath.row] floatValue]
if (height) {
return height
}else{
height = [[FoundCellHeight shareInstance] cellHeightWithModel:self.datalist[indexPath.row]]
[self.heightArray addObject:@(height)]
return height
}
}
计算高度的类中:
+ (FoundCellHeight *)shareInstance {
static dispatch_once_t onceToken
dispatch_once(&onceToken, ^{
_sharedInstance = [[FoundCellHeight alloc] init]
})
return _sharedInstance
}
1、设置一个专门管理cell高度的字典,用indexPath.row作为KEY,Value初始化为44。比如名字叫heightDict
2、
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
在这个方法中,indexPath.row作为key,从heightDict中拿到Value。这个value就是返回值。
3、
Cell中,每次下载更新图片前,先把cell高度保存起来。等下载更新完成,界面重新设置完毕后,比较当前cell高度和保存值是否相同。如果不同,就发delegate给ViewController,把当前cell高度和indexpath当作参数传递出去。
4、
ViewController中的delegate回调方法中,把indexPath.row作为key,将传入的Cell高度存入heightDict中,然后[tableView reloadData]
5完成
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)