美文网首页iOS的高大上魔法🔮学习
使用Masonry 记录/ 修改一个控件的约束 (入门+进阶)

使用Masonry 记录/ 修改一个控件的约束 (入门+进阶)

作者: 游龙飞雪 | 来源:发表于2017-02-28 14:29 被阅读1959次

    1、使用Masonry设置约束

    2、根据条件修改这个控件的约束(如:这个控件所参考的控件变为另一个)

    3、小结

    提醒:此篇涉及到的控件和属性偏多,所以想看下去需要一点耐心~~

    总纲:

    我们知道,使用masonry给控件设置约束,有3个方法可调用,分别是 mas_make,mas_remake,mas_update。给一个控件设置好了约束之后想要修改,如果基于相同的控件使用mas_update,基于不同的控件使用mas_remake(这里还有不明白的同志请自行查看masonry文档)。

    (1) 要想在程序的其他逻辑中修改一个控件的约束,那就要先定义一个约束属性记录下来上次设置的约束 (当成一个普通的成员属性既可);

    (2) 在其他逻辑中修改约束之前,要先拿到约束属性卸载之;

    (3)根据条件设置约束(使用 mas_make 即可)。

    1. 需求

    ——1.1 一个view 界面有两个控件,A 和B。

    ——1.2 最初,A的top紧贴view的top;B在A下方,B的top紧贴A的bottom。

    ——1.3 根据条件,B的top要更改,更改后B的top紧贴view的top。

    2. 实现

    //constraint

    @property(nonatomic,strong)MASConstraint *lable2TopConstraint;

    2.1

    [label1 mas_makeConstraints:^(MASConstraintMaker*make) {

    make.top.equalTo(self).mas_offset(0);

    make.left.right.equalTo(self.view).mas_offset(0);

    make.height.mas_offset(22);

    }];

    2.2

    [label2 mas_makeConstraints:^(MASConstraintMaker*make) {

        if(self.type==2) {

      _lable2TopConstraint = make.top.equalTo(label1.mas_bottom).mas_offset(0);

      }else{

      _lable2TopConstraint = make.top.equalTo(self.view).mas_offset(0);

      }

      make.left.right.equalTo(self.view).mas_offset(0);

      make.bottom.equalTo(self.view).mas_offset(0);

    }];

    2.3 修改lable2TopConstraint

    //modify layout

    [_lable2TopConstraint  uninstall]; //先将label2 的top 约束卸载

    if(self.type==2) {

        [self.label2  mas_makeConstraints:^(MASConstraintMaker*make) {

    _lable2TopConstraint = make.top.equalTo(self.lable1.mas_bottom).mas_offset(0);

    }];

    }else{

    [self.label2  mas_makeConstraints:^(MASConstraintMaker*make) { 

    _lable2TopConstraint = make.top.equalTo(self.view).mas_offset(0);

    }];

    }

    3. 小结

    3.1 要想在程序的其他逻辑中修改一个控件的约束,那就要先定义一个约束属性记录下来第一次设置的约束;

    3.2 在其他逻辑中修改约束之前,要先拿到约束属性卸载之;

    3.3 根据条件设置约束(使用 mas_make 即可)。

    --------  附  -------

    既然约束可以记录成属性,不同的约束可以记录成多个不同的属性,那么就可以根据条件来切换已经记录下来的不同的约束。

    =============================

    ============  进阶  ============

    =============================

    进阶需求:

    多个控件竖直排列,需要根据条件调整任意多个控件的隐藏/显示。

    如上图 v1/ v2/ v3/ v4顺序竖直排列。(v1/v2/v3/v4 都有可能隐藏)

    解决思路:

    -- 1. 记录多个控件的 top 约束;

    -- 2. 设置 v2 隐藏和显示;

    -- 3. 分别找到 v2 下方和上方第一个 visible 的控件

    ---- 3.1 若 v2 隐藏,设置 v2 下方第一个 visible 的控件的 top  equalTo 上方第一个  visible 的控件的 bottom;

    ----3.2 若 v2 显示,先设置 v2.top  equalTo 其上方第一个 visible 的控件的 bottom;

    再设置 v2 下方第一个 visible 的控件的 top  equalTo  v2 的 bottom。

    -- 4. 可能有些人会问,在某个条件的一个分支中卸载修改了另一个控件的约束,而在另一个分支中没有修改,会不会造成约束不准确的情况?

    此处虽然在某个条件的一个分支中修改了某个控件的约束,但是在设置这个控件本身隐藏/显示的时候,如果自身是显示的,还会把本身的约束设置正确。

    如此,OK!

    希望能帮助到大家!

    相关文章

      网友评论

      • 游龙飞雪:复制上来的代码不知道如何使用代码专用格式,只能堆到文字里。欢迎有知道的大神指点一二!
        陨之希留leo:使用简书里的MarkDown语法编辑就好了。网上MarkDown语法很多
        游龙飞雪:@victoria_purple 我看他们可以放代码,可以左右滑动的。
        victoria_purple:直接放图片就可以

      本文标题:使用Masonry 记录/ 修改一个控件的约束 (入门+进阶)

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