今天在做UI 的時(shí)候,突然在做 UILabel 橫向展示的時(shí)候卡了一下奔脐,于是決定總結(jié)一下常見的情況,以免再犯快速解決吁讨,特此先看下常見的幾種情況:
- 1髓迎、僅僅固定間距
- 2、固定間距建丧,等寬度
- 3竖般、固定間距,寬度根據(jù)內(nèi)容而定
1茶鹃、僅僅固定間距
[self.oneLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.view.mas_centerY);
make.leading.mas_equalTo(20);
}];
[self.twoLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.view.mas_centerY);
make.leading.equalTo(self.oneLabel.mas_trailing).offset(20);
}];
[self.threeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.view.mas_centerY);
make.leading.equalTo(self.twoLabel.mas_trailing).offset(20);
make.trailing.mas_equalTo(-20);
}];
2涣雕、固定間距,等寬度
[self.oneLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.view.mas_centerY);
make.leading.mas_equalTo(20);
}];
[self.twoLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.view.mas_centerY);
make.leading.equalTo(self.oneLabel.mas_trailing).offset(20);
make.width.equalTo(self.oneLabel.mas_width);
}];
[self.threeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.view.mas_centerY);
make.leading.equalTo(self.twoLabel.mas_trailing).offset(20);
make.trailing.mas_equalTo(-20);
make.width.equalTo(self.twoLabel.mas_width);
}];
此處注意當(dāng)內(nèi)容超過寬度時(shí)挣郭,不考慮其他情況下,有時(shí)僅僅用numberOfLines = 0 就達(dá)到下面這種效果啦
3疗韵、固定間距兑障,寬度根據(jù)內(nèi)容而定
正常情況中約束優(yōu)先級(jí)是相同的,就猶如圖1 一樣蕉汪,如果需要特殊對(duì)待流译,就可以通過 抗拉 抗壓來改變啦
[self.twoLabel
setContentCompressionResistancePriority:UILayoutPriorityRequired
forAxis:UILayoutConstraintAxisHorizontal
];
當(dāng)然此種情況下,注意優(yōu)先級(jí)別的區(qū)分者疤,別三者都設(shè)置成一樣, 否則也就沒什么區(qū)別啦...
例如確定:Three 福澡、Two 優(yōu)先級(jí)高
[self.twoLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
[self.threeLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
但是此處要注意有可能當(dāng)驹马,twoLabel 和 threeLabel 內(nèi)容過多時(shí)革砸,此處直接把OneLabel 約束沒有啦
這肯定是不合理的除秀,在我們有三者都要確定,又不換行的情況下算利,還是在某個(gè)Label 上確定個(gè)高度比較合理册踩,同時(shí)調(diào)整下被擠壓的情況。其實(shí)通常我們只要確定一個(gè) 具有最大的優(yōu)先級(jí)比較合理效拭。
延伸一下:equalTo & priority 在Masonry 中的使用
- equalTo
- (MASConstraint * (^)(id attr))equalTo;
- (MASConstraint * (^)(id attr))greaterThanOrEqualTo;
- (MASConstraint * (^)(id attr))lessThanOrEqualTo;
- priority
typedef UILayoutPriority MASLayoutPriority;
static const MASLayoutPriority MASLayoutPriorityRequired = UILayoutPriorityRequired;
static const MASLayoutPriority MASLayoutPriorityDefaultHigh = UILayoutPriorityDefaultHigh;
static const MASLayoutPriority MASLayoutPriorityDefaultMedium = 500;
static const MASLayoutPriority MASLayoutPriorityDefaultLow = UILayoutPriorityDefaultLow;
static const MASLayoutPriority MASLayoutPriorityFittingSizeLevel = UILayoutPriorityFittingSizeLevel;
上面這兩個(gè)平常用的不多暂吉,但是偶爾來一下,卻常常是點(diǎn)睛之筆缎患,為我們省下好多事情慕的,特別是解決一些代碼約束沖突的情況。
舉例:
-
內(nèi)容少就固定寬度较锡,內(nèi)容多就自適應(yīng)
當(dāng)然這種情況下业稼,是水平方向沒有其他額外的擠壓的情況。
make.width.mas_equalTo(60).priority(MASLayoutPriorityDefaultLow);
make.width.greaterThanOrEqualTo(@60);
相對(duì)來說蚂蕴,后者更為霸道一些低散,此處前者更適合,可以看看實(shí)際效果來對(duì)比用骡楼。
- 不大于某一個(gè)寬度熔号,又可自適應(yīng)
make.leading.equalTo(self.oneLabel.mas_trailing).offset(20);
make.trailing.mas_equalTo(-20);
make.width.lessThanOrEqualTo(@(40));
這種情況還特別適合用到,某個(gè)大View 中包含小View 時(shí)鸟整,里面的高度不確定引镊,然后又要一一適配,此時(shí)用到lessThanOrEqualTo 可讓沖突很巧妙去掉篮条。
- 更多例子....
另外注意下: 相同約束下弟头,哪個(gè)先確定,哪一個(gè)的優(yōu)先級(jí)換句話說就越高涉茧。
總的說來赴恨,這也是對(duì)Masonry 的再次熟悉使用!