学无止境iOS Developer恩美第二个APP项目

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

2017-01-19  本文已影响575人  這Er

这都2017年了还在用frame布局实在是有点low了。。。
Autolayout自iOS6开始引入,到现在基本上也没什么坑了,就算有,前辈们也都填好了( ⁼̴̀ .̫ ⁼̴́ )✧

自动计算cell高度

我理解的自动计算cell高度,有两个注意点:
第一: 设置tableView.estimatedRowHeight
self.tableView.estimatedRowHeight = 20

第二: 设置约束,保证cell的contentView的高度可以根据子控件算出来
例如以下只有一个label填充的cell(cell的结构->cell--contentView--label)
只需要给label添加以下约束:

// 布局
    [_contentLabel mas_updateConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(_contentLabel.superview.mas_left).with.offset(20);
        make.top.equalTo(_contentLabel.superview.mas_top).with.offset(20);
        make.right.equalTo(_contentLabel.superview.mas_right).with.offset(-20);
        make.bottom.equalTo(_contentLabel.superview.mas_bottom).with.offset(-20);
    }];

cell就可以自动计算自己的高度

内容高度不固定的cell

实现cell的折叠和展开

先说我觉的比较好的实现方法:上面约束不用变改变Label的numberOfLines就可以,需要展开的时候设置为0,折叠的时候设置为3。

下面的是我的想法过程,大家可以略过:
一开始的时候想的是给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可以限制行数......这不就是现成的实现折叠/展开的最好方法吗...

效果:
可以折叠的cell的效果图
Demo :

test-autolayoutcell

文章参考 :

1.Masonry
2.优化UITableViewCell高度计算的那些事
3.iOS7和iOS8下的自适应cell

上一篇下一篇

猜你喜欢

热点阅读