關于autolayout的優先級的問題在網上已經有很多資料了,推薦一個:
Autolayout中關于intrinsic content、相關優先級及其應用
這篇文章詳細講解了在使用storyboard中如何設置Content Hugging 和 Content Compression的優先級,我這里我就說下怎么使用代碼設置優先級作為補充。用代碼設置布局一般都使用masonry,所以我就在使用masonry的基礎上寫demo。
添加兩個label
UILabel* leftLabel = [[UILabel alloc] init];
leftLabel.backgroundColor = [UIColor redColor];
[self.view addSubview:leftLabel];
leftLabel.text = @"人做的畜生之事越多,內心越是痛苦。";
[leftLabel sizeToFit];
UILabel* rightLabel = [[UILabel alloc] init];
rightLabel.backgroundColor = [UIColor greenColor];
[self.view addSubview:rightLabel];
rightLabel.text = @"1234567890";
[rightLabel sizeToFit];
設置布局
[leftLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(@(20));
make.left.equalTo(self.view).offset(10);
make.centerY.equalTo(self.view);
make.right.mas_lessThanOrEqualTo(rightLabel.mas_left);
}];
[rightLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(@(20));
make.left.mas_greaterThanOrEqualTo(leftLabel.mas_right);
make.right.equalTo(self.view).offset(-10);
make.centerY.equalTo(leftLabel);
}];
運行效果
0.png
在默認情況下,我們沒有設置各個布局的優先級,那么他就會優先顯示左邊的label,左邊的完全顯示后剩余的空間都是右邊的label,如果整個空間寬度都不夠左邊的label的話,那么右邊的label沒有顯示的機會了。
如果我們現在的需求是優先顯示右邊的label,左邊的label內容超出的省略,這時就需要我們調整約束的優先級了。
理論
- 約束優先級: 在Autolayout中每個約束都有一個優先級, 優先級的范圍是1 ~ 1000。創建一個約束,默認的優先級是最高的1000
- Content Hugging Priority: 該優先級表示一個控件抗被拉伸的優先級。優先級越高,越不容易被拉伸,默認是250。
- Content Compression Resistance Priority: 該優先級和上面那個優先級相對應,表示一個控件抗壓縮的優先級。優先級越高,越不容易被壓縮,默認是750
所以默認情況下兩邊的label的Content Hugging和Content Compression優先級都是一樣的,為了讓右邊的label完全顯示,那么我們需要增大右邊label的抗壓縮級,或者減小左邊label的抗壓縮級,總之是得讓右邊的抗壓縮級大于左邊的label,這樣才能讓右邊的label內容優先顯示。
UIView中關于Content Hugging 和 Content Compression Resistance的方法有:
- (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里面添加代碼:
[leftLabel setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal];
或者
[rightLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
UILayoutPriority
類型實際上就是float
類型,只要設置右邊的比左邊的大就可以。
修改后的效果
1.png
對于多個labe或者button利用類似的方法都可以做到優先顯示某一個控件的內容。