iOS AutoLayout中的Content Hugging 和 Content Compression Resistance優先級問題

關于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 HuggingContent 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利用類似的方法都可以做到優先顯示某一個控件的內容。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容