一敛瓷、先做一個比較
- 使用系統(tǒng)自帶的方法
UIView *superview = self.view;
//創(chuàng)建一個 view1
UIView *view1 = [[UIView alloc] init];
view1.translatesAutoresizingMaskIntoConstraints = NO;
view1.backgroundColor = [UIColor greenColor];
[superview addSubview:view1];
UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);
[superview addConstraints:@[
//view1 constraints
[NSLayoutConstraint constraintWithItem:view1
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:superview
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:padding.top],
[NSLayoutConstraint constraintWithItem:view1
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:superview
attribute:NSLayoutAttributeLeft
multiplier:1.0
constant:padding.left],
[NSLayoutConstraint constraintWithItem:view1
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:superview
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:-padding.bottom],
[NSLayoutConstraint constraintWithItem:view1
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:superview
attribute:NSLayoutAttributeRight
multiplier:1
constant:-padding.right]
]];
- 使用 masonry 實現同樣效果玄柠,代碼進行比較:
- 第一種方法:
UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(superview.mas_top).with.offset(padding.top); //with is an optional semantic filler
make.left.equalTo(superview.mas_left).with.offset(padding.left);
make.bottom.equalTo(superview.mas_bottom).with.offset(-padding.bottom);
make.right.equalTo(superview.mas_right).with.offset(-padding.right);
}];
- 第二種方法:
UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(superview).with.insets(padding);
}];
二憋飞、masonry 的簡單使用
2.1.創(chuàng)建一個 size 為 (100同规,100) 大小,位置位于右下角的 view:
- 首先創(chuàng)建一個 view:yellow
UIView *yellow = [[UIView alloc]init];
yellow.backgroundColor = [UIColor yellowColor];
yellow.backgroundColor = [UIColor cyanColor];
[self.view addSubview:yellow];
注:創(chuàng)建完 view 控件之后就要加入父控件中咧擂,因為添加約束時候會參照父控件進行約束敛助,如果不這樣做運行時就會在約束處報錯。
- 添加約束方法一:
[yellow mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(100, 100));
make.bottom.mas_equalTo(self.view).offset(-20);
make.right.mas_equalTo(self.view.mas_right).offset(-20);
}];
- 添加約束方法二:
[yellow mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(100, 100));
make.bottom.offset(-20);
make.right.mas_equalTo(self.view).offset(-20);
}];
- 添加約束方法三:
[yellow mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.equalTo(@(100));
make.height.mas_equalTo(100);
make.right.offset(-20);
make.bottom.mas_equalTo(self.view).offset(-20);
}];
總結:①方法一和方法二所添加約束代碼有所不同屋确,通過仔細觀察可以發(fā)現以下三句代碼所起作用一樣纳击,系統(tǒng)會根據 make. 后面的關鍵詞進行自動匹配后面的內容:
make.bottom.mas_equalTo(self.view.mas_bottom).offset(-20);
make.bottom.mas_equalTo(self.view).offset(-20);
make.bottom.offset(-20);
- 如果后面有 mas_equalTo 就進行匹配;
- 如果句中沒有 mas_equalTo 就會自動添加和 make. 后面的關鍵詞對應的約束攻臀。
②方法三種 make.width.equalTo(@(100)) 的 make.width.equalTo 中傳入的參數要是 id 類型的焕数,所以必須要對基本數據類型進行封裝;而 make.height.width.mas_equalTo(100) 中的 mas_equalTo 會對傳入的參數進行自動封裝刨啸,所以對傳入的參數可以不封裝堡赔。
2.2.創(chuàng)建一個大小為父控件大小 0.3 倍的控件,并居中顯示:
- 方法一:
[yellow mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.equalTo(self.view).multipliedBy(0.3);
make.centerX.mas_equalTo(self.view.mas_centerX);
make.centerY.mas_equalTo(self.view.mas_centerY);
}];
以上約束 X 和 Y 的語句中设联,都可以再進行更改善已,例如把 mas_equalTo(self.view.mas_centerY) 改成 mas_equalTo(self.view)灼捂,效果一樣。
- 方法二:
[yellow mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.equalTo(self.view).multipliedBy(0.3);
make.center.mas_equalTo(self.view.center);
}];
同樣:以上代碼中的 mas_equalTo(self.view.center) 可以把參數中的 **.center **去掉换团。
三悉稠、總結:
- 一般的項目都很少使用系統(tǒng)提供的自動布局方法,轉而使用 masonry 第三方框架艘包;
- mas_equalTo 和 equalTo 比較:
- mas_equalTo:這個方法會對參數進行包裝的猛;
- equalTo:這個方法不會對參數進行包裝;
- mas_equalTo 的功能強于 equalTo 想虎。
- 優(yōu)化 mas_
- 加入下面這句代碼** #define MAS_SHORTHAND** 卦尊,在所有地方都可以把 mas_ 去掉,但是此句必須要加在 **#import "本類類名"; ** 之前(即導入本類頭文件之前)舌厨;
- 但是有些 mas_ 不能去掉岂却,比如:make.width.mas_equalTo(100);必須要進行包裝,此時在 #import "本類類名" 之前加入以下一句即可:#define MAS_SHORTHAND_GLOBALS
- 建議:
- 在不確定的時候裙椭,所有地方都使用帶有 mas_ 的關鍵字淌友;
- 在文件中引入 ** #define MAS_SHORTHAND** 和 #define MAS_SHORTHAND_GLOBALS 之后,就不需要在考慮任何 mas_ 骇陈。
- 約束的類型:
- 尺寸:width/height/size
- 邊界:left/leading/right/trailing/top/bottom
- 中心的:center/centerX/centerY
- 邊界:edges
總之,masonry 的語法很靈活瑰抵,勤加練習你雌,找到規(guī)律,使用起來就會覺得很輕松了 O(∩_∩)O