美文网首页学无止境iOS Developer恩美第二个APP项目
Masonry自适应cell高度,同时实现cell折叠和展开

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

作者: 這Er | 来源:发表于2017-01-19 19:22 被阅读575次

    这都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

    相关文章

      网友评论

      • 梁森的简书:[_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);
        }];

        有demo吗?我就不知道这段代码怎么实现cell的高度自适应。
        计算cell高度的代码是什么?

        我做cell自适应高度的时候总是得先计算出cell上label的高度(动态高度)然后再去计算cell的高度
        梁森的简书:看了你的demo果然可以,我之前都一直去实现了heightForRowAtIndexPath这个代理方法去计算cell的高度,如果不去实现这个方法,cell就能自动计算出自己的高度了。 学习了,谢谢:+1:
        梁森的简书:@這Er 我下载你的demo看看先 :blush:
        這Er:Demo 加到文章上了,label 的高度是自动计算的,不需要手动算出

      本文标题:Masonry自适应cell高度,同时实现cell折叠和展开

      本文链接:https://www.haomeiwen.com/subject/qtyibttx.html