首先默認(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);
}];

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

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

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

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é)果是:

因?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];
效果如圖:

那如果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í)!