Masonry入门学习
Masonry
作用
轻量级布局框架,使用便捷的链式语法封装自动布局,简介明了,并且具有高可读性
在iOS开发中,如何布局UI是我们给用户良好体验的前提,在以往我们选择使用设置控件的frame来确定位置,简单的界面还好,但是对于复杂的界面如果再使用frame的话计算起来就很繁琐了,所以引入了自动布局(AutoLayout)来确定控件之间的位置,但是这种方式代码看起来太复杂了,可读性不高,如果想要了解的可以看笔者的这篇博客:AutoLayout自动布局
基本属性
//基本属性:
@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;
约束的使用
基础API
-
使用时经常需要加mas_前缀,如果不想可以在引用masonry文件前加上下面的内容
//定义这个常量,就可以不用在开发过程中使用mas_前缀
#define MAS_SHORTHAND
//可以让Masonry帮我们自动把基础数据类型的数据,自动装箱为对象类型
#define MAS_SHORTHAND_GLOBALS
-
添加约束的三种方法
//添加新约束
- (NSArray *)mas_makeConstraints:(void(NS_NOESCAPE ^)(MASConstraintMaker *make))block;//更新约束,会覆盖之前的约束
- (NSArray *)mas_updateConstraints:(void(NS_NOESCAPE ^)(MASConstraintMaker *make))block;//完全移除旧约束,添加新约束
- (NSArray *)mas_remakeConstraints:(void(NS_NOESCAPE ^)(MASConstraintMaker *make))block;
Masonry是基于AutoLayout的实现计算视图的frame的
两种写法
-
mas_EqualTo():支持类型转换,支持复杂类型,是对equalTo的封装,使用的时候不需要指定约束边,默认取前面需要添加约束的边
-
equalTo:参数是对象类型,一般是视图对象活着mas_width、mas_height这样的坐标系对象
修饰语
Masonry为了让代码使用和阅读更容易理解,添加了and和with两个方法,只是将内部的self返回。
- (MASConstraint* )with {return self;
}
倍数
在Masonry中可以使用multipledBy设置一个视图的某个参数是另一视图某个参数的多少倍
make.size.equalTo(self.view).multipliedBy(0.8);
insets
make.edges.equalTo(self.view).insets(UIEdgeInsetsMake(<#CGFloat top#>, <#CGFloat left#>, <#CGFloat bottom#>, <#CGFloat right#>));
对应位置填入需要内嵌的便偏移量就行,不用区分正负
优先级
-
Priority可以指定具体的优先级(0 -- 1000)
-
priorityHigh:高优先级,值为750
-
priorityMedium:介于高和低之间(250 -- 750之间)
-
priorityLow:低优先级(值为250)
优先级写在链的最后
make.top.equalTo(self.view).with.priority(999);
使用示例
#import "ViewController.h"
#import "Masonry.h"
@interface ViewController ()
@property (nonatomic, strong)UIView* parentView;
@property (nonatomic, strong)UIView* childView;
@end
@implementation ViewController
- (void)viewDidLoad {[super viewDidLoad];[self createView];[self createButton];
}
- (void)createButton {UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect];button.backgroundColor = [UIColor systemBlueColor];[button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];[button setTitle:@"移动" forState:UIControlStateNormal];[self.view addSubview:button];[button mas_makeConstraints:^(MASConstraintMaker *make) {make.bottom.equalTo(self.view).offset(-200);make.left.equalTo(self.view).offset(100);make.width.height.mas_equalTo(60);}];[button addTarget:self action:@selector(pressButton) forControlEvents:UIControlEventTouchUpInside];;
}
- (void)pressButton {[self.parentView mas_remakeConstraints:^(MASConstraintMaker *make) {make.width.height.mas_equalTo(180);}];
}
- (void)createView {self.parentView = [[UIView alloc] init];self.parentView.backgroundColor = [UIColor yellowColor];[self.view addSubview:self.parentView];[self.parentView mas_makeConstraints:^(MASConstraintMaker *make) {make.top.equalTo(self.view).offset(40);make.left.equalTo(self.view).offset(40);make.height.width.mas_equalTo(300);}];self.childView = [[UIView alloc] init];self.childView.backgroundColor = [UIColor redColor];[self.parentView addSubview:self.childView];[self.childView mas_makeConstraints:^(MASConstraintMaker *make) {make.left.equalTo(self.parentView);make.top.equalTo(self.parentView);make.height.width.mas_equalTo(50);}];
}
@end
在这个demo里,我先使用了mas_make....方法为两个UIView添加了约束,在点击按钮后又使用mas_remake...方法更新了两个UIView的布局,通过上面的图片可以直观的看到效果
注意事项
-
在使用masonry前需要先将视图添加到对应的父视图上才行,否则程序会崩溃
-
注意使用mas_euqalTo和equalTo的区别
-
一个完整的约束需要包含位置、大小,缺一不可