ios第三方框架Masonry----約束

在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_)

我講的很簡單,網上有許多牛人的博客能夠搜索。

推薦倆:http://www.cocoachina.com/ios/20150702/12217.html

https://www.cnblogs.com/wqcoder/p/5511676.html

相關文章
相關標籤/搜索