Masonry自動佈局使用

ForrestWoo發表於2015-12-18

  Masonry是一個輕量級的佈局框架,採用更好的語法封裝自動佈局,它有自己的佈局DSL。簡潔明瞭並具有高可讀性 而且同時支援 iOS 和 Max OS X。

  下載

  NSLayoutConstraints的缺點

  NSLayoutConstraints是一個強大且靈活的自動佈局架構,可是透過程式碼建立的約束是十分冗餘,下面我們透過一段程式碼來實現你想要一個檢視鋪滿它的父檢視。但是邊距為10

 

UIView *superview = self;

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],

 ]];

 

  即使一個簡單的例子所需的程式碼都相當冗長,當你有超過 2 或 3 檢視時變得不可讀,另一種選擇是使用視覺化格式語言 (VFL),有點不太冗長。然而,ASCII 型別語法上有它自己的陷阱並且作為 NSLayoutConstraint constraintsWithVisualFormat: 新增動畫效果 返回一個陣列也有點難。

  Masonry的優點

  下面是使用MASConstraintMaker建立同樣的約束

    UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);

    [self.subview mas_makeConstraints:^(MASConstraintMaker *make) {

        make.top.equalTo(self.view.mas_top).with.offset(padding.top);

        make.left.equalTo(self.view.mas_left).with.offset(padding.left);

        make.bottom.equalTo(self.view.mas_bottom).with.offset(-padding.bottom);

        make.right.equalTo(self.view.mas_right).with.offset(-padding.right);

    }];

 

  更短程式碼實現

 [self.subview mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(self.view).with.insets(padding);
    }];

 

此外還需注意使用NSLayoutConstraints時呼叫了[superview addConstraints:... ] 方法,在Masonry庫中是自動向當前檢視新增約束的,我們也可以透過self.subview.translatesAutoresizingMaskIntoConstraints = NO來手動設定。

 

  並不是所有建立都一樣 

.equalTo               等價於 NSLayoutRelationEqual

.lessThanOrEqualTo      等價於  NSLayoutRelationLessThanOrEqual

.greaterThanOrEqualTo 等價於  NSLayoutRelationGreaterThanOrEqual

  這些三個等式約束可以是下列任一操作作為一個引數

1. MASViewAttribute

MASViewAttributeNSLayoutAttribute
view.mas_left NSLayoutAttributeLeft
view.mas_right NSLayoutAttributeRight
view.mas_top NSLayoutAttributeTop
view.mas_bottom NSLayoutAttributeBottom
view.mas_leading NSLayoutAttributeLeading
view.mas_trailing NSLayoutAttributeTrailing
view.mas_width NSLayoutAttributeWidth
view.mas_height NSLayoutAttributeHeight
view.mas_centerX NSLayoutAttributeCenterX
view.mas_centerY NSLayoutAttributeCenterY
view.mas_baseline NSLayoutAttributeBaseline

 

 

 

 

 

 

 

 

 

 

2. UIView/NSView

如果你想要view.left大於或等於label.left可以

make.left.greaterThanOrEqualTo(label);
make.left.greaterThanOrEqualTo(label.mas_left);

3. NSNumber

自動佈局允許寬度和高度設定為常量值。如果你想要將檢視具有最小值和最大寬度設定你可以

//width >= 200 && width <= 400
make.width.greaterThanOrEqualTo(@200);
make.width.lessThanOrEqualTo(@400)

然而自動佈局不允許對齊屬性如左對齊、 右對齊,centerY等將設定為常量值

//creates view.left = view.superview.left + 10
make.left.lessThanOrEqualTo(@10)

 

make.top.mas_equalTo(42);
make.height.mas_equalTo(20);
make.size.mas_equalTo(CGSizeMake(50, 100));
make.edges.mas_equalTo(UIEdgeInsetsMake(10, 0, 10, 0));
make.left.mas_equalTo(view).mas_offset(UIEdgeInsetsMake(10, 0, 10, 0));

 

您可以使用基元和結構打造你的約束替代 NSNumber。預設情況下,支援自動裝箱的宏均以 mas_ 作為字首。沒有字首的版本均可透過匯入之前定義 MAS_SHORTHAND_GLOBALS。

4. NSArray

make.height.equalTo(@[view1.mas_height, view2.mas_height]);
make.height.equalTo(@[view1, view2]);
make.left.equalTo(@[view1, @100, view3.right]);

  

  優先原則

.priority 允許你指定優先順序

.priorityHigh等價於 UILayoutPriorityDefaultHigh高優先順序

.priorityMedium 中等優先順序

.priorityLow 等價於 UILayoutPriorityDefaultLow

make.left.greaterThanOrEqualTo(label.mas_left).with.priorityLow();

make.top.equalTo(label.mas_top).with.priority(600);

 

組成

Masonry也提供了幾個方便的方法,同時建立多個約束,被稱為 MASCompositeConstraints。

edges

// make top, left, bottom, right equal view2
make.edges.equalTo(view2);

// make top = superview.top + 5, left = superview.left + 10,
// bottom = superview.bottom - 15, right = superview.right - 20
make.edges.equalTo(superview).insets(UIEdgeInsetsMake(5, 10, 15, 20))

 

center

// make centerX and centerY = button1
make.center.equalTo(button1)

// make centerX = superview.centerX - 5, centerY = superview.centerY + 10
make.center.equalTo(superview).centerOffset(CGPointMake(-5, 10))
// All edges but the top should equal those of the superview
make.left.right.and.bottom.equalTo(superview);
make.top.equalTo(otherView);

 

相關文章