开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
前言
在布局时,如果需要根据特定的模型数据来移除或者安装特定的约束条件,这个时候可以使用MASConstraint的- (void)uninstall { MASMethodNotImplemented(); } 和- (void)install { MASMethodNotImplemented(); } 进行实现。
I 应用场景
1.1 收款详情界面
例子:如果是支付成功状态的订单,界面底部显示退款按钮
其他支付状态隐藏退款按钮
/**
用于退款视图底部约束的移除与安装
*/
@property MASConstraint *makebottomequalToWeakSelf4tableV;
[_tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(weakSelf);
make.left.equalTo(weakSelf).offset(kAdjustRatio(0));
weakSelf.makebottomequalToWeakSelf4tableV = make.bottom.equalTo(weakSelf);
if(weakSelf.viewModel.ishiddenPtinterBtn){// 隐藏打印、退款按钮
[weakSelf.makebottomequalToWeakSelf4tableV install];
}else{
// 移除
[weakSelf.makebottomequalToWeakSelf4tableV uninstall];
}
make.right.equalTo(weakSelf).offset(-kAdjustRatio(0));
}];
1.2 入库单详情界面
例子: 例如入库单详情界面,如果是未审核状态的时候,就需要在底部展示审核按钮,这个时候就可以对tableView底部约束进行安装和移除。
核心代码示例:
if(!weakSelf.viewModel.isShowBottomBtn){
[self.makebottomequalToWeakSelf4TV install];
}else{
[self.makebottomequalToWeakSelf4TV uninstall];
}
前后效果对比
1.3 签到界面
签到界面根据班次信息进行动态修改视图的高度和对齐方式:
1个班次的界面
4个班次的签到界面
II 约束的安装与移除
2.1 定义 MASConstraint 属性
/**
用于图片底部约束的移除与安装
*/
@property MASConstraint *makebottomequalToWeakSelf4imgV;
2.2 根据特定条件进行约束的安装和卸载
根据使用包含特定字段models.tradeNo进行移除和卸载特定的约束
__weak __typeof__(self) weakSelf = self;
[self.imgV mas_updateConstraints:^(MASConstraintMaker *make) {
self.makebottomequalToWeakSelf4imgV = make.bottom.equalTo(weakSelf).offset(-kAdjustRatio(14));
}];
if([NSStringQCTtoll isBlankString:models.tradeNo]){
self.tradeNoLab.text = @"";
self.tradeNoLab.hidden = YES;
[self.tradeNoLab mas_updateConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(weakSelf.titleLab).offset(kAdjustRatio(0));
make.left.equalTo(weakSelf.imgV.mas_right).offset(kAdjustRatio(16));
}];
[self.timeLab mas_updateConstraints:^(MASConstraintMaker *make) {
make.bottom.equalTo(weakSelf.imgV).offset(kAdjustRatio(3));
make.left.equalTo(weakSelf.titleLab).offset(kAdjustRatio(0));
}];
[self.imgV mas_updateConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(kAdjustRatio(36), kAdjustRatio(36)));
make.left.equalTo(weakSelf).offset(kAdjustRatio(0));
make.top.equalTo(weakSelf).offset(kAdjustRatio(14));
}];
[self.makebottomequalToWeakSelf4imgV install];
}else{
self.tradeNoLab.hidden = NO;
self.tradeNoLab.text = models.tradeNo;
[self.tradeNoLab mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(weakSelf.titleLab.mas_bottom).offset(kAdjustRatio(3));
make.left.equalTo(weakSelf.imgV.mas_right).offset(kAdjustRatio(16));
}];
[self.timeLab mas_updateConstraints:^(MASConstraintMaker *make) {
make.bottom.equalTo(weakSelf).offset(kAdjustRatio(-3));
make.left.equalTo(weakSelf.titleLab).offset(kAdjustRatio(0));
make.top.equalTo(weakSelf.tradeNoLab.mas_bottom).offset(kAdjustRatio(3));
}];
[self.imgV mas_updateConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(kAdjustRatio(36), kAdjustRatio(36)));
make.left.equalTo(weakSelf).offset(kAdjustRatio(0));
make.top.equalTo(weakSelf).offset(kAdjustRatio(14));
}];
[self.makebottomequalToWeakSelf4imgV uninstall];
}
2.3 注意事项
一个视图针对不同的视图(比如A和B)的bottom约束,是不会进行覆盖的,记得移除其中一个,否则会冲突。
- 相对于图片控件weakSelf.imgV的bottom约束,
[self.timeLab mas_updateConstraints:^(MASConstraintMaker *make) {
weakSelf.makeTop4TimeLab = make.top.equalTo(weakSelf.tradeNoLab.mas_bottom).offset(kAdjustRatio(4));
weakSelf.makebottom4timeLab = make.bottom.equalTo(weakSelf.imgV).offset(kAdjustRatio(3));
}];
- 相对于weakSelf的bottom约束。这个时候需要移除self.makebottom4timeLab,否则会冲突
[self.makeTop4TimeLab install];
[self.makebottom4timeLab uninstall];
[self.timeLab mas_updateConstraints:^(MASConstraintMaker *make) {
make.bottom.equalTo(weakSelf).offset(kAdjustRatio(-14));
make.left.equalTo(weakSelf.titleLab).offset(kAdjustRatio(0));
make.height.mas_equalTo(kAdjustRatio(13));
}];
III 预备知识:比例约束的使用
3.1 倍数 multipliedBy
make.width.equalTo(weakSelf).multipliedBy(0.6);
3.2 dividedBy
例子 【1、Masonry以动画的形式更新约束 2、利用dividedBy进行九宫格布局3、Masonry约束宽高比的例子demo】
see also
更多内容请关注 #小程序:iOS逆向,只为你呈现有价值的信息,专注于移动端技术研究领域;更多服务和咨询请关注#公号:iOS逆向。