關(guān)于autolayout的優(yōu)先級(jí)的問題在網(wǎng)上已經(jīng)有很多資料了,推薦一個(gè):
Autolayout中關(guān)于intrinsic content斩箫、相關(guān)優(yōu)先級(jí)及其應(yīng)用
這篇文章詳細(xì)講解了在使用storyboard中如何設(shè)置Content Hugging 和 Content Compression的優(yōu)先級(jí)纯衍,我這里我就說下怎么使用代碼設(shè)置優(yōu)先級(jí)作為補(bǔ)充蔗衡。用代碼設(shè)置布局一般都使用masonry,所以我就在使用masonry的基礎(chǔ)上寫demo蝙叛。
添加兩個(gè)label
UILabel* leftLabel = [[UILabel alloc] init];
leftLabel.backgroundColor = [UIColor redColor];
[self.view addSubview:leftLabel];
leftLabel.text = @"人做的畜生之事越多俺祠,內(nèi)心越是痛苦。";
[leftLabel sizeToFit];
UILabel* rightLabel = [[UILabel alloc] init];
rightLabel.backgroundColor = [UIColor greenColor];
[self.view addSubview:rightLabel];
rightLabel.text = @"1234567890";
[rightLabel sizeToFit];
設(shè)置布局
[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);
}];
運(yùn)行效果
在默認(rèn)情況下借帘,我們沒有設(shè)置各個(gè)布局的優(yōu)先級(jí)蜘渣,那么他就會(huì)優(yōu)先顯示左邊的label,左邊的完全顯示后剩余的空間都是右邊的label姻蚓,如果整個(gè)空間寬度都不夠左邊的label的話宋梧,那么右邊的label沒有顯示的機(jī)會(huì)了。
如果我們現(xiàn)在的需求是優(yōu)先顯示右邊的label狰挡,左邊的label內(nèi)容超出的省略捂龄,這時(shí)就需要我們調(diào)整約束的優(yōu)先級(jí)了。
理論
- 約束優(yōu)先級(jí): 在Autolayout中每個(gè)約束都有一個(gè)優(yōu)先級(jí), 優(yōu)先級(jí)的范圍是1 ~ 1000加叁。創(chuàng)建一個(gè)約束倦沧,默認(rèn)的優(yōu)先級(jí)是最高的1000
- Content Hugging Priority: 該優(yōu)先級(jí)表示一個(gè)控件抗被拉伸的優(yōu)先級(jí)。優(yōu)先級(jí)越高它匕,越不容易被拉伸展融,默認(rèn)是250。
- Content Compression Resistance Priority: 該優(yōu)先級(jí)和上面那個(gè)優(yōu)先級(jí)相對(duì)應(yīng)豫柬,表示一個(gè)控件抗壓縮的優(yōu)先級(jí)告希。優(yōu)先級(jí)越高,越不容易被壓縮烧给,默認(rèn)是750
所以默認(rèn)情況下兩邊的label的Content Hugging和Content Compression優(yōu)先級(jí)都是一樣的燕偶,為了讓右邊的label完全顯示,那么我們需要增大右邊label的抗壓縮級(jí)础嫡,或者減小左邊label的抗壓縮級(jí)指么,總之是得讓右邊的抗壓縮級(jí)大于左邊的label酝惧,這樣才能讓右邊的label內(nèi)容優(yōu)先顯示。
UIView中關(guān)于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
類型實(shí)際上就是float
類型伯诬,只要設(shè)置右邊的比左邊的大就可以晚唇。
修改后的效果
對(duì)于多個(gè)labe或者button利用類似的方法都可以做到優(yōu)先顯示某一個(gè)控件的內(nèi)容。