在ios開發中用xib的方式,其中約束的功能非常強大,但在純代碼開發中添加約束就不就那麼方便了,Masonry的出現改變了這一現象。html
先看一段代碼:ios
UIView *view = [UIView new]; [view setBackgroundColor:[UIColor redColor]]; [self.view addSubview:view]; [view mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.view).with.insets(UIEdgeInsetsMake(10, 10, 10, 10)); //make.left.equalTo(self.view).with.offset(10); //make.right.equalTo(self.view).with.offset(-10); //make.top.equalTo(self.view).with.offset(10); //make.bottom.equalTo(self.view).with.offset(-10); }];
其中mas_makeConstraints就是添加約束。其中代碼意思是上下左右距邊界10。註釋掉的代碼同義。是否是很方便。git
Masonry配置github
- 推薦使用pods方式引入類庫,pod 'Masonry'。ide
- 引入頭文件 #import "Masonry.h"。spa
- Masonry的github地址:https://github.com/SnapKit/Masonrycode
Masonry使用講解orm
再看上方的代碼,註釋掉的代碼用中文來講就是view的左邊與父類相比較移動10.其餘三個方向同義。(我的理解)htm
注意點1: 使用 mas_makeConstraints方法的元素必須事先添加到父元素的中,例如[self.view addSubview:view];對象
注意點2: masequalTo 和 equalTo 區別:masequalTo 比equalTo多了類型轉換操做,通常來講,大多數時候兩個方法都是 通用的,可是對於數值元素使用mas_equalTo。對於對象或是多個屬性的處理,使用equalTo。特別是多個屬性時,必須使用equalTo,例如 make.left.and.right.equalTo(self.view);
注意點3: 注意到方法with和and,這連個方法其實沒有作任何操做,方法只是返回對象自己,這這個方法的左右徹底是爲了方法寫的時候的可讀性 。make.left.and.right.equalTo(self.view);和make.left.right.equalTo(self.view);是徹底同樣的,可是明顯的加了and方法的語句可讀性 更好點。
@implementation view - (id)init { self = [super init]; if (!self) return nil; flg = YES; self.backgroundColor = [UIColor redColor]; bgview = [UIView new]; bgview.backgroundColor = [UIColor yellowColor]; [self addSubview:bgview]; [bgview makeConstraints:^(MASConstraintMaker *make) { make.width.equalTo(self.width).offset(-20); make.height.equalTo(self.height).offset(-20); make.left.equalTo(self.left).offset(10); make.top.equalTo(self.top).offset(10); make.bottom.equalTo(self.bottom).offset(-10); make.right.equalTo(self.right).offset(-10); }]; btn = [UIButton new]; [btn setBackgroundColor:[UIColor blueColor]]; [btn setTitle:@"按鈕" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(btn_ction:) forControlEvents:UIControlEventTouchUpInside]; [bgview addSubview:btn]; lab = [UILabel new]; [lab setBackgroundColor:[UIColor greenColor]]; [bgview addSubview:lab]; [lab makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(btn.bottom).offset(50); make.left.equalTo(bgview.left).offset(15); make.width.equalTo(200); make.height.equalTo(40); }]; return self; } - (void)btn_ction:(id)sender{ flg = !flg; [self setNeedsUpdateConstraints]; [self updateConstraintsIfNeeded]; } -(void)updateConstraints{ if (flg) { [btn makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(bgview.left).offset(15); make.top.equalTo(bgview.top).offset(40); make.width.equalTo(100); make.height.equalTo(30); }]; }else{ [btn remakeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(bgview.left).offset(15); make.top.equalTo(bgview.top).offset(60); make.width.equalTo(200); make.height.equalTo(30); }]; } [super updateConstraints]; } @end
上面是我本身試着寫的代碼,bgview邊界縮了一點,在bgview上加上了一個button,還有一個lable(lable的約束是相對button來算的)
給button添加了點擊事件,改變約束。在這裏,改變約束要寫在-(void)updateConstraints這個方法裏,謹記。仔細看代碼,執行了
[self setNeedsUpdateConstraints]; [self updateConstraintsIfNeeded];
這倆,系統就會執行-(void)updateConstraints了。
差點忘了一點,
//1. 對於約束參數能夠省去"mas_" #define MAS_SHORTHAND
//2. 對於默認的約束參數自動裝箱 #define MAS_SHORTHAND_GLOBALS
必須在引入頭文件 #import "Masonry.h"以前。(我代碼裏就沒有mas_)
我講的很簡單,網上有許多牛人的博客能夠搜索。