iOS自动布局优先级,抗压缩(CompressionResistance),抗膨胀(Hugging)等级

我们平时给有内容的控件布局,一般只需要设置两个布局就可以确定位置,比如UILabel设置left,top,就可以,而不用设置宽高,就能够正常布局,这就是因为控件有抗压缩等级,内容可以自动撑开宽高。

如果是固定的文字,图片,可以不用设置边界。但如果是网络获取的动态数据,需要考虑内容边界,比如单个label超出显示范围,超出屏幕,需要换行或者压缩显示;多个label需要优先显示哪个,压缩哪个label。

这就用到了抗膨胀等级和抗压缩等级

设置抗膨胀等级(直译是紧凑等级),

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

控件之间内容没有填充满,那个控件的优先级低,哪个就会拉伸,

设置抗压缩等级

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

控件之间内容被填充满,需要压缩哪个控件,优先级低的会被压缩

打印控件的紧凑等级和抗压缩等级

    NSLog(@"%f",[label contentHuggingPriorityForAxis:UILayoutConstraintAxisHorizontal]);//250
    NSLog(@"%f",[textField contentCompressionResistancePriorityForAxis:UILayoutConstraintAxisHorizontal]);//750

控件的紧凑等级默认为250,抗压缩等级为750;

如果是xib创建的控件,设置完约束可以看到UILabel紧凑等级为251,其他控件大多为250


xib布局会更加直观的看到,紧凑等级和抗压缩等级的效果,当xib可修复报红时,经常自动调整控件的抗压缩等级

举两个开发中常见的例子:

1.xib方式两个控件
比如一排两个label,A、B,如果B长度固定,A长度是不固定的,A和B左右贴边显示,设置A右大于等于B左,内容很短不会报错


两个控件正常布局.png

如果A内容很长可能会覆盖B,会报一个修改抗压缩优先级错误,点击change priority可以自动修复


内容过长会报一个修改抗压缩优先级错误.jpg

所以A很长的时候需要压缩A,可以像上面自动修复抗压缩等级,也可以手动设置A水平抗压缩等级小于750,A文字多或少都能够兼容,效果如下

两个控件正常布局.png

两个控件,如果是代码布局,不用手动设置抗压缩等级
下面展示一个三个Label,代码布局的例子

2.一排三个label,A、B、C,长度都不固定,当内容过长,先压缩A,再压缩B,最后压缩C,所以抗压缩等级C>B>A,A右小于等于B左,B右等于C左。

    UILabel *text = UILabel.new;
    [self.view addSubview:text];

    [text mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.view);
        make.top.equalTo(self.view).offset(100);
    }];
    text.text = @"123";
    
    
    UILabel *text3 = UILabel.new;
    [self.view addSubview:text3];

    [text3 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.equalTo(self.view);
        make.centerY.equalTo(text);
    }];
    text3.text = @"UILabelUILabelUILabelUILabelUILabelUILabelUILabelUILabel";
    
    
    UILabel *text2 = UILabel.new;
    [self.view addSubview:text2];

    [text2 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.equalTo(text3.mas_left);
        make.centerY.equalTo(text);
        make.left.greaterThanOrEqualTo(text.mas_right);
    }];
    text2.text = @"AAAA";
    
    
    [text setContentCompressionResistancePriority:730 forAxis:UILayoutConstraintAxisHorizontal];
    [text2 setContentCompressionResistancePriority:740 forAxis:UILayoutConstraintAxisHorizontal];
    [text3 setContentCompressionResistancePriority:750 forAxis:UILayoutConstraintAxisHorizontal];

你可能感兴趣的:(iOS自动布局优先级,抗压缩(CompressionResistance),抗膨胀(Hugging)等级)