你的位置:首页 > 操作系统

[操作系统]Masonry自动布局使用


  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_leftNSLayoutAttributeLeft
view.mas_rightNSLayoutAttributeRight
view.mas_topNSLayoutAttributeTop
view.mas_bottomNSLayoutAttributeBottom
view.mas_leadingNSLayoutAttributeLeading
view.mas_trailingNSLayoutAttributeTrailing
view.mas_widthNSLayoutAttributeWidth
view.mas_heightNSLayoutAttributeHeight
view.mas_centerXNSLayoutAttributeCenterX
view.mas_centerYNSLayoutAttributeCenterY
view.mas_baselineNSLayoutAttributeBaseline

 

 

 

 

 

 

 

 

 

 

2. UIView/NSView

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

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

3. NSNumber

自动布局允许宽度和高度设置为常量值。如果你想要将视图具有最小值和最大宽度设置你可以

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

然而自动布局不允许对齐属性如左对齐、 右对齐,centerY等将设置为常量值

//creates view.left = view.superview.left + 10make.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 view2make.edges.equalTo(view2);// make top = superview.top + 5, left = superview.left + 10,// bottom = superview.bottom - 15, right = superview.right - 20make.edges.equalTo(superview).insets(UIEdgeInsetsMake(5, 10, 15, 20))

 

center

// make centerX and centerY = button1make.center.equalTo(button1)// make centerX = superview.centerX - 5, centerY = superview.centerY + 10make.center.equalTo(superview).centerOffset(CGPointMake(-5, 10))

// All edges but the top should equal those of the superviewmake.left.right.and.bottom.equalTo(superview);make.top.equalTo(otherView);