添加约束mas_make/mas_update/mas_rema

作者: CoderLXWang | 来源:发表于2016-08-26 12:49 被阅读5420次

    今天在优化项目中一个界面的时候,涉及到masonry布局中添加约束的几种方式的问题,masonry中给一个View添加约束有这几种方式,
    mas_makeConstraints
    mas_updateConstraints
    mas_remakeConstraints
    ,可能大家常用mas_makeConstraints 这种方式, 并且对其他几种不是特别清楚, 这里具体的举例说一下, 可直接拉到底部看结论

    1. 项目中遇到的问题

    先来说一下项目中遇到的问题, 有这样一个评论界面,如图,

    Paste_Image.png Paste_Image.png

    内部的View不是一定有,比如昵称右侧的年龄,性别, 头像下方的消费信息粉色的View,评论正文下面的图片, 这样在tableview的Cell复用中就可能出问题, 一般可以remove重新创建, 也可以各种hidden=YES/=NO, 这些都是常规的处理, 但是做完这些处理之后, 显示出来的效果却是这个鬼样子。。。

    Paste_Image.png Paste_Image.png

    其实这两种效果中间只差了一个re,就是mas_makeConstraints 和
    mas_remakeConstraints , 把所有的make换成remake就可以了

    2. 通过示例讲解mas_make/mas_update/mas_remake

    其实对一个View布局, 添加方式的区别就是这个View是不是已经约束, 有的话新加的要怎么处理的问题, 以下示例分三种方面研究,
    1, View已有A类型约束, 又添加A类型约束。
    2, View没有A类型约束, 又添加A类型约束。
    3, 新添加的时候是否删除已有约束。

    代码大体如下, 改动尝试即可

    - (void)test {
        WS(ws);
        
        UIView *redView = [[UIView alloc] init];
        redView.backgroundColor = [UIColor redColor];
        [self.view addSubview:redView];
        [redView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(ws.view).offset(100);
            make.left.equalTo(ws.view).offset(100);
            make.size.mas_equalTo(CGSizeMake(100, 100));
        }];
        
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    
            [redView mas_makeConstraints:^(MASConstraintMaker *make) {
                make.top.equalTo(ws.view).offset(100);
                make.left.equalTo(ws.view).offset(100);
                make.size.mas_equalTo(CGSizeMake(200, 100));
            }];
            
            [self.view setNeedsLayout];
            [self.view layoutIfNeeded];
        });
    }
    

    先看mas_makeConstraints , 只有size的宽度变了, 这种情况View不会变化, 即
    1, 已有size约束, 再添加size约束, 不修改
    2, 将初始的size移除掉, 其他不变, 会发现屏幕上本来没有View(因为没有size), 2秒后出现200*100View, 即没有size约束, 添加size, 会更新这个约束
    3, 将dispatch_after约束变成只有make.size.mas_equalTo(CGSizeMake(200, 100));, 2秒后无变化, 说明不会删除已有约束

    其他两种按这种方式试一试就清楚了, 下面直接给出结论,

    make update remake
    已有某类型约束,再添加 不更新 更新 更新
    没有某类型约束,再添加 更新 更新 更新
    是否删除已有约束 不删除 不删除 全删
    简而言之, make用第一次添加的, update用最新的, remake不光用最新的还得把老的全干掉, 再看项目中的问题, 就是复用的Cell内部的View已有约束, 还用make添加, 不更新, 换remake即可

    <br />


    masonry系列其他文章

    基本使用 http://www.jianshu.com/p/b5fe6c20f162
    等间距布局 http://www.jianshu.com/p/2c7a5ba73fc2
    demo地址 https://github.com/CoderLXWang/HowToUseMasonry

    相关文章

      网友评论

      • 第六梦:谢谢分享,找了一晚上的bug,就是因为他
      • 郑一一一一:有个case 不知道 有简便一点的方法没有? 就是 1、一个label 一个imageView 的center Y 相同 2、两个元素之间的间距固定 3、label的长度可能会变化 3、两个元素 作为整体要和屏幕的centerX相同 现在我必须每次动态计算 label的长度,然后才能整体居中。 问如何用masonry实现?请问有更容易的实现么 。
        田心甜心:有啊,一般你这种的组合式的控件,创建一个空白view,然后把你想要的控件都放上去,在布局空白view就行啦
      • S型身材的猪:太棒了,一个 mas_reamrk提醒了我一下,让我解决了重大 bug
        CoderLXWang: @乐升平 只有走过坑才会意识到这几个的差别。。。😂😂😂

      本文标题:添加约束mas_make/mas_update/mas_rema

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