Masonry介紹與使用實踐(快速上手Autolayout)
前言
1 |
MagicNumber -> autoresizingMask -> autolayout |
以上是純手寫程式碼所經歷的關於頁面佈局的三個時期
-
在iphone1-iphone3gs時代 window的size固定為(320,480) 我們只需要簡單計算一下相對位置就好了
-
在iphone4-iphone4s時代 蘋果推出了retina屏 但是給了碼農們非常大的福利:window的size不變
-
在iphone5-iphone5s時代 window的size變了(320,568) 這時
autoresizingMask
-
在iphone6+時代 window的width也發生了變化(相對5和5s的螢幕比例沒有變化) 終於是時候拋棄
autoresizingMask
改用autolayout了(不用支援ios5了 相對於螢幕適配的多樣性來說autoresizingMask
也已經過時了)
那如何快速的上手autolayout呢? 說實話 當年ios6推出的同時新增了autolayout的特性 我看了一下官方文件和demo 就立馬拋棄到一邊了 因為實在過於的繁瑣和囉嗦
(有過經驗的朋友肯定有同感)
直到iphone6釋出之後 我知道使用autolayout勢在必行了 這時想起了以前在瀏覽Github看到過的一個第三方庫Masonry 在花了幾個小時的研究使用後 我就將autolayout掌握了(重點是我並沒有學習任何的官方文件或者其他的關於autolayout的知識
介紹
Masonry是一個輕量級的佈局框架 擁有自己的描述語法 採用更優雅的鏈式語法封裝自動佈局 簡潔明瞭 並具有高可讀性 而且同時支援
iOS 和 Max OS X
我們先來看一段官方的sample code來認識一下Masonry
123 |
[view1 mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(superview).with.insets(padding);}]; |
看到block裡面的那句話: make
edges equalTo superview with insets
通過鏈式的自然語言 就把view1給autolayout好了 是不是簡單易懂?
使用
看一下Masonry支援哪一些屬性
1234567891011 |
@property (nonatomic, strong, readonly) MASConstraint *left;@property (nonatomic, strong, readonly) MASConstraint *top;@property (nonatomic, strong, readonly) MASConstraint *right;@property (nonatomic, strong, readonly) MASConstraint *bottom;@property (nonatomic, strong, readonly) MASConstraint *leading;@property (nonatomic, strong, readonly) MASConstraint *trailing;@property (nonatomic, strong, readonly) MASConstraint *width;@property (nonatomic, strong, readonly) MASConstraint *height;@property (nonatomic, strong, readonly) MASConstraint *centerX;@property (nonatomic, strong, readonly) MASConstraint *centerY;@property (nonatomic, strong, readonly) MASConstraint *baseline; |
這些屬性與NSLayoutAttrubute的對照表如下
Masonry | NSAutoLayout | 說明 |
---|---|---|
left | NSLayoutAttributeLeft | 左側 |
top | NSLayoutAttributeTop | 上側 |
right | NSLayoutAttributeRight | 右側 |
bottom | NSLayoutAttributeBottom | 下側 |
leading | NSLayoutAttributeLeading | 首部 |
trailing | NSLayoutAttributeTrailing | 尾部 |
width | NSLayoutAttributeWidth | 寬 |
height | NSLayoutAttributeHeight | 高 |
centerX | NSLayoutAttributeCenterX | 橫向中點 |
centerY | NSLayoutAttributeCenterY | 縱向中點 |
baseline | NSLayoutAttributeBaseline | 文字基線 |
其中leading與left trailing與right 在正常情況下是等價的 但是當一些佈局是從右至左時(比如阿拉伯文?沒有類似的經驗) 則會對調 換句話說就是基本可以不理不用 用left和right就好了
在ios8釋出後 又新增了一堆奇奇怪怪的屬性(有興趣的朋友可以去瞅瞅) Masonry暫時還不支援(不過你要支援ios6,ios7 就沒必要去管那麼多了)
在講例項之前 先介紹一個MACRO
1 |
#define WS(weakSelf) __weak __typeof(&*self)weakSelf = self;
|
快速的定義一個weakSelf 當然是用於block裡面啦 下面進入正題(為了方便 我們測試的superView都是一個size為(300,300)的UIView)
下面 通過一些簡單的例項來簡單介紹如何輕鬆愉快
的使用Masonry:
1. [基礎] 居中顯示一個view
1234567891011121314151617 |
- (void)viewDidLoad{ [super viewDidLoad]; // Do any additional setup after loading the view. WS(ws); UIView *sv = [UIView new]; [sv showPlaceHolder]; sv.backgroundColor = [UIColor blackColor]; [self.view addSubview:sv]; [sv mas_makeConstraints:^(MASConstraintMaker *make) { make.center.equalTo(ws.view); make.size.mas_equalTo(CGSizeMake(300, 300)); }];} |
使用我之間寫的MMPlaceHolder 可以看到superview已經按照我們預期居中並且設定成了適當的大小
那麼先看看這幾行程式碼
12345678910111213141516 |
//從此以後基本可以拋棄CGRectMake了UIView *sv = [UIView new];//在做autoLayout之前 一定要先將view新增到superview上 否則會報錯[self.view addSubview:sv];//mas_makeConstraints就是Masonry的autolayout新增函式 將所需的約束新增到block中行了[sv mas_makeConstraints:^(MASConstraintMaker *make) { //將sv居中(很容易理解吧?) make.center.equalTo(ws.view); //將size設定成(300,300) make.size.mas_equalTo(CGSizeMake(300, 300)); |