Masonry自适应cell高度,同时实现cell折叠和展开

Masonry自适应cell高度,同时实现cell折叠和展开,第1张

这都2017年了还在用frame布局实在是有点low了。。。

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完成


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/tougao/11160372.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存