使用Masonry 记录/ 修改一个控件的约束 (入门+进阶)
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!
希望能帮助到大家!