iOS的高大上魔法🔮学习

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

2017-02-28  本文已影响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!

希望能帮助到大家!

上一篇下一篇

猜你喜欢

热点阅读