iOS 同一方向布局优先级的使用
2019-03-12 本文已影响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的结论】视图的宽度要小于等于
内容的宽度。
【注意】
- 水平的两个视图需要同时调用相应的同一个API,一个优先级设置成UILayoutPriorityDefaultLow,另一个设置成UILayoutPriorityRequired(不要设置成UILayoutPriorityDefaultHigh,有时候不生效)才会生效。如果只对某一个视图设置成High会出问题,估计是默认优先级导致的,为了避免这些因素,建议俩视图都要设置一遍。
- autoLayout布局的时候适当添加优先级,可以避免一些约束报错问题。