Masonry 和 布局優(yōu)先級(jí)約束

首先默認(rèn)讀者已經(jīng)知道了Masonry的基本使用。這里講解怎么通過(guò)UIView的兩個(gè)方法實(shí)現(xiàn)布局的優(yōu)先級(jí)。

- (void)setContentHuggingPriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis NS_AVAILABLE_IOS(6_0);
- (void)setContentCompressionResistancePriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis NS_AVAILABLE_IOS(6_0);

其中 - (void)setContentHuggingPriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis;是用來(lái)設(shè)置控件抗拉伸的優(yōu)先級(jí)。因?yàn)槭强估?,我們用兩個(gè)寬度比較小的UILabel做示范:

//兩個(gè)水平布局的label,兩邊間隔分別是12,中間間隔為8(懂意思就行)
UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectZero];
label1.backgroundColor = [UIColor redColor];
label1.text = @"我是標(biāo)題";
[self.view addSubview:label1];
 [label1 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.centerY.equalTo(self.view);
    make.left.equalTo(@(12));
 }];
    
UILabel *label2 = [[UILabel alloc] initWithFrame:CGRectZero];
label2.backgroundColor = [UIColor redColor];
label2.text = @"我是描述";
[self.view addSubview:label2];
[label2 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.centerY.equalTo(label1);
    make.left.equalTo(label1.mas_right).offset(8);
    make.right.equalTo(self.view).offset(-12);
}];

圖一@2x.png

如果不添加任何約束是圖一這樣顯示的。那如果我們的需求是label1正常顯示,拉伸label2呢,或者說(shuō)label2的內(nèi)容緊跟著label1的內(nèi)容顯示。
只需要這樣做:

[label1 setContentHuggingPriority:UILayoutPriorityRequired
                          forAxis:UILayoutConstraintAxisHorizontal];
[label2 setContentHuggingPriority:UILayoutPriorityDefaultLow
                          forAxis:UILayoutConstraintAxisHorizontal];

顯示結(jié)果:

圖二.png

這里解釋一下設(shè)置的兩個(gè)參數(shù):

圖三.png

很容易明白,對(duì)應(yīng)的1000到50代表優(yōu)先級(jí)從高到低。

圖四.png

UILayoutConstraintAxisHorizontal 橫向布局 UILayoutConstraintAxisVertical 縱向布局

然后是- (void)setContentCompressionResistancePriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis是用來(lái)設(shè)置控件抗壓縮的優(yōu)先級(jí)。因?yàn)槭强箟嚎s,我們用兩個(gè)寬度比較大的UILabel做示范:

UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectZero];
label1.backgroundColor = [UIColor redColor];
label1.text = @"我是標(biāo)題啊我是標(biāo)題啊我是標(biāo)題啊我是標(biāo)題啊";
[self.view addSubview:label1];
 [label1 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.centerY.equalTo(self.view);
    make.left.equalTo(@(12));
 }];
    
UILabel *label2 = [[UILabel alloc] initWithFrame:CGRectZero];
label2.backgroundColor = [UIColor redColor];
label2.text = @"我是描述啊我是描述啊我是描述啊我是描述啊";
[self.view addSubview:label2];
[label2 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.centerY.equalTo(label1);
    make.left.equalTo(label1.mas_right).offset(8);
    make.right.equalTo(self.view).offset(-12);
}];

不加約束的結(jié)果是:

圖五.png

因?yàn)閘abel1過(guò)長(zhǎng),已經(jīng)把label2擠的就剩一點(diǎn)了。如果我們想優(yōu)先顯示label2,如下設(shè)置:

[label1 setContentCompressionResistancePriority:UILayoutPriorityDefaultLow
                                        forAxis:UILayoutConstraintAxisHorizontal];
[label2 setContentCompressionResistancePriority:UILayoutPriorityRequired
                                        forAxis:UILayoutConstraintAxisHorizontal];

效果如圖:

圖七.png

那如果label1和lebel2非常長(zhǎng)呢,不管設(shè)置誰(shuí)的優(yōu)先級(jí),其中一個(gè)都會(huì)被擠沒(méi)了怎么辦?
make.width.greaterThanOrEqualTo 可以設(shè)置寬度最少為多少
make.width.lessThanOrEqualTo可以設(shè)置寬度最多為多少
這個(gè)我就不在舉例了,很有必要自己練練手,體驗(yàn)一下。

以上純屬個(gè)人理解,希望對(duì)你有所幫助,如果有不對(duì)的地方歡迎指出交流。

如有其它問(wèn)題也歡迎留言,一起分享學(xué)習(xí)!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容