約束優先級: 在Autolayout中每個約束都有一個優先級, 優先級的范圍是1 ~ 1000。創建一個約束,默認的優先級是最高的1000
Content Hugging Priority: 該優先級表示一個控件抗被拉伸的優先級。優先級越高,越不容易被拉伸,默認是250。
Content Compression Resistance Priority: 該優先級和上面那個優先級相對應,表示一個控件抗壓縮的優先級。優先級越高,越不容易被壓縮,默認是750
有這樣一個cell,底部品牌的長度是不固定的,右邊的車系也是不固定,並且車系的高度會自動換行,numberOfLines=0;針對這樣的cell布局,若果正常布局,達到的效果如下:
布局部分代碼:
[self.brandLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.productNameLb.mas_left);
make.top.mas_equalTo(lineView.mas_bottom).mas_offset(10);
}];
[self.carTypeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(lineView.mas_bottom).mas_offset(10);
make.left.mas_equalTo(self.brandLabel.mas_right).mas_offset(20);
make.right.mas_offset(-10);
make.bottom.mas_offset(-10);
}];
很明顯這里的布局屬於約束沖突的情況,想要解決這樣的情況方法也有多種,這里介紹一種autolayout里面有一個叫做抗壓縮 抗拉伸的概念 方法如下:
- (UILayoutPriority)contentHuggingPriorityForAxis:(UILayoutConstraintAxis)axis NS_AVAILABLE_IOS(6_0);
- (void)setContentHuggingPriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis NS_AVAILABLE_IOS(6_0);
- (UILayoutPriority)contentCompressionResistancePriorityForAxis:(UILayoutConstraintAxis)axis NS_AVAILABLE_IOS(6_0);
- (void)setContentCompressionResistancePriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis NS_AVAILABLE_IOS(6_0);
然后回到我們這次的問題,很明顯右邊的內容過多導致左邊內容顯示不全,那么利用左邊抗壓縮的概念,提高左邊label水平方向的抗壓縮值,右邊label提高垂直方向抗壓縮值 代碼如果
[self.brandLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal]; //設置水平方向抗壓縮優先級高 水平方向可以正常顯示
[self.carTypeLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical]; //設置垂直方向擠壓縮優先級高 垂直方向可以正常顯示
設置了抗壓縮后達到了效果如下: