美文网首页iOS开发知识小集
iOS 同一方向布局优先级的使用

iOS 同一方向布局优先级的使用

作者: 远方的枫叶 | 来源:发表于2019-03-12 23:03 被阅读32次

    需求描述

    布局一个父view上两个同一水平的label1和label2,要求如下
    (1)当两个label内容长度大于view的宽度时,label1的内容不能被压缩
    (2)当两个label内容都过小时,label1的长度的长度不能被拉长,也就是说label1的长度不能大于label1的内容的长度
    (3)两个label的长度都不能写死

    解决问题的相关API

    【注】下面只说水平方向的场景,垂直方向同理;

    - (void)setContentCompressionResistancePriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis;
    

    从字面单词Content内容Compression压缩Resistance反抗来看此方法,大意就是视图的内容不能被压缩。

    - (void)setContentHuggingPriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis;
    

    同样Content内容Hugging紧贴、拥抱Priority优先级,意味着视图要紧贴着内容。

    根据上述理解,这两个API我都需要调用,因为我的左侧(label1)既不能被拉伸,也不能被压缩,同时又满足了宽度灵活。

    - (void)createContents {
        [self addSubview:self.titleLbl];
        [self addSubview:self.valueLbl];
        
        
        [self.titleLbl mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.bottom.equalTo(self);
            make.left.equalTo(self).offset(18);
            make.centerY.equalTo(self);
        }];
        
        [self.titleLbl setContentHuggingPriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisHorizontal];
        [self.titleLbl setContentCompressionResistancePriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisHorizontal];
        
        
        [self.valueLbl mas_makeConstraints:^(MASConstraintMaker *make) {
            make.right.equalTo(self).offset(-18);
            make.centerY.equalTo(self.titleLbl);
            make.left.greaterThanOrEqualTo(self.titleLbl.mas_right).offset(5);
        }];
        
        [self.valueLbl setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal];
        [self.valueLbl setContentHuggingPriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal];
    }
    
    WechatIMG4638.png

    总结

    【API 1的结论】视图的宽度要大于等于内容的宽度
    【API 2的结论】视图的宽度要小于等于内容的宽度。



    【注意】
    1. 水平的两个视图需要同时调用相应的同一个API,一个优先级设置成UILayoutPriorityDefaultLow,另一个设置成UILayoutPriorityRequired(不要设置成UILayoutPriorityDefaultHigh,有时候不生效)才会生效。如果只对某一个视图设置成High会出问题,估计是默认优先级导致的,为了避免这些因素,建议俩视图都要设置一遍。
    2. autoLayout布局的时候适当添加优先级,可以避免一些约束报错问题。

    相关文章

      网友评论

        本文标题:iOS 同一方向布局优先级的使用

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