我们平时给有内容的控件布局,一般只需要设置两个布局就可以确定位置,比如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左,内容很短不会报错
如果A内容很长可能会覆盖B,会报一个修改抗压缩优先级错误,点击change priority可以自动修复
所以A很长的时候需要压缩A,可以像上面自动修复抗压缩等级,也可以手动设置A水平抗压缩等级小于750,A文字多或少都能够兼容,效果如下
两个控件,如果是代码布局,不用手动设置抗压缩等级
下面展示一个三个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];