淺談 iOS AutoLayout 中 Label 的抗拉伸和抗壓縮

UIView 中關(guān)于 Content HuggingContent 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);

Autolayout 優(yōu)先級的范圍是 1 ~ 1000刹泄,創(chuàng)建一個約束绷跑,默認(rèn)的優(yōu)先級是最高的 1000

Content Hugging Priority

Content Hugging Priority: 該優(yōu)先級表示一個控件抗被拉伸的優(yōu)先級脊凰。優(yōu)先級越高,越不容易被拉伸钠右,默認(rèn)是251邪意。

使用場景:
當(dāng)一個視圖上有多個 intrinsic content size 的子控件,子視圖的總和丽蝎,不夠填充父視圖區(qū)域時猎拨,此屬性可以控制優(yōu)先拉伸哪個視圖內(nèi)容。

Content Compression Resistance Priority

Content Compression Resistance Priority: 該優(yōu)先級和上面那個優(yōu)先級相對應(yīng)屠阻,表示一個控件抗壓縮的優(yōu)先級红省。優(yōu)先級越高,越不容易被壓縮国觉,默認(rèn)是750吧恃。

使用場景:
當(dāng)一個視圖上有多個 intrinsic content size 的子控件,并且子控件可能會超出父視圖的區(qū)域時蛉加,此屬性可控制哪些視圖被內(nèi)容被優(yōu)先壓縮蚜枢,使其不超出父視圖區(qū)域。

舉例說明

Content Compression Resistance Priority

View 中添加了一個 UILabel

- (void)demo1 {
    
    UILabel *yellowLabel = [[UILabel alloc] init];
    yellowLabel.text = @"我是黃色Label,我是黃色Label,我是黃色Label,我是黃色Label";
    yellowLabel.backgroundColor = [UIColor yellowColor];
    [self.view addSubview:yellowLabel];
    
    [yellowLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.center.equalTo(self.view);
        make.left.equalTo(self.view).offset(100);
        make.right.equalTo(self.view).offset(-100);
    }];
}
image.png

從最后的顯示效果來看针饥,中間的 Label 被壓縮了厂抽。因為左右約束的優(yōu)先級比固有內(nèi)容相關(guān)的優(yōu)先級要高,所以 Autolayout 布局的時候會優(yōu)先滿足左右兩個約束丁眼。這時候:左邊約束寬度 + 右邊約束寬度 + Label 的固有內(nèi)容寬度 > 屏幕寬度筷凤。所以最后只能壓縮 Label 顯示的寬度。

修改 View 左邊約束和右邊約束的優(yōu)先級,或者只修改左(右)邊約束優(yōu)先級藐守,然后設(shè)置 Label 抗壓縮的優(yōu)先級挪丢。

- (void)demo1 {
    
    UILabel *yellowLabel = [[UILabel alloc] init];
    yellowLabel.text = @"我是黃色Label,我是黃色Label";
    yellowLabel.backgroundColor = [UIColor yellowColor];
    [self.view addSubview:yellowLabel];
    [yellowLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
    [yellowLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.center.equalTo(self.view);
        make.left.equalTo(self.view).offset(100).priority(250);
        make.right.equalTo(self.view).offset(-100).priority(250);
    }];
    
}
image.png

這時候 Label 控件的抗壓縮約束優(yōu)先級比右邊約束優(yōu)先級高,Autolayout 先滿足 Lable 控件的固有內(nèi)容 Size 的寬度卢厂,然后再滿足左邊和右邊約束乾蓬,表現(xiàn)出來就是 Lable 抗壓縮特性變強了,它更傾向于顯示它固有內(nèi)容 Size慎恒,這時候被壓縮的就是左邊和右邊的約束任内。

Content Hugging Priority

View 中添加了一個 UILabel

- (void)demo2 {
    
    UILabel *bluelabel = [[UILabel alloc] init];
    bluelabel.text = @"我是藍色Label";
    bluelabel.backgroundColor = [UIColor blueColor];
    [self.view addSubview:bluelabel];
    
    [bluelabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.center.equalTo(self.view);
        make.left.equalTo(self.view).offset(100);
        make.right.equalTo(self.view).offset(-100);
    }];
}
image.png

拉伸和壓縮的時候類似,左右約束優(yōu)先級比 LabelContent Hugging Priority 優(yōu)先級高融柬,并且此時:左邊約束寬度 + 右邊約束寬度+ Label 的固有內(nèi)容寬度 < 屏幕寬度死嗦。為了滿足左右兩個約束,就只有拉伸 Label粒氧。

- (void)demo2 {
    
    UILabel *bluelabel = [[UILabel alloc] init];
    bluelabel.text = @"我是藍色Label";
    bluelabel.backgroundColor = [UIColor blueColor];
    [self.view addSubview:bluelabel];
    [bluelabel setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
    [bluelabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.center.equalTo(self.view);
        make.left.equalTo(self.view).offset(100).priority(250);
        make.right.equalTo(self.view).offset(-100).priority(250);
    }];
}
image.png

這時候 Label 控件的抗拉伸約束優(yōu)先級比右邊約束優(yōu)先級高越除,Autolayout 先滿足 Lable 控件的固有內(nèi)容 Size 的寬度,然后再滿足左邊和右邊約束,表現(xiàn)出來就是 Lable 抗拉伸特性變強了,它更傾向于顯示它固有內(nèi)容 Size,這時候被拉伸的就是左邊和右邊的約束。

Label 的抗拉伸和抗壓縮

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末埃碱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铣耘,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件囤锉,死亡現(xiàn)場離奇詭異坦弟,居然都是意外死亡,警方通過查閱死者的電腦和手機官地,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門酿傍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驱入,你說我怎么就攤上這事赤炒。” “怎么了亏较?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵莺褒,是天一觀的道長。 經(jīng)常有香客問我雪情,道長遵岩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮尘执,結(jié)果婚禮上舍哄,老公的妹妹穿的比我還像新娘。我一直安慰自己誊锭,他們只是感情好表悬,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丧靡,像睡著了一般蟆沫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窘行,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天饥追,我揣著相機與錄音,去河邊找鬼罐盔。 笑死但绕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惶看。 我是一名探鬼主播捏顺,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼纬黎!你這毒婦竟也來了幅骄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤本今,失蹤者是張志新(化名)和其女友劉穎拆座,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冠息,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡挪凑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了逛艰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躏碳。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖散怖,靈堂內(nèi)的尸體忽然破棺而出菇绵,到底是詐尸還是另有隱情,我是刑警寧澤镇眷,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布咬最,位于F島的核電站,受9級特大地震影響欠动,放射性物質(zhì)發(fā)生泄漏丹诀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铆遭。 院中可真熱鬧硝桩,春花似錦、人聲如沸枚荣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽橄妆。三九已至衙伶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間害碾,已是汗流浹背矢劲。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留慌随,地道東北人芬沉。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像阁猜,于是被迫代替她去往敵國和親丸逸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容