iOS 小技能:MASConstraint的安装与移除 ( 应用场景:灵活控制视图的展示与隐藏)

75 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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】

blog.csdn.net/z929118967/…

see also

更多内容请关注 #小程序:iOS逆向,只为你呈现有价值的信息,专注于移动端技术研究领域;更多服务和咨询请关注#公号:iOS逆向