前言
MagicNumber -> autoresizingMask -> autolayout
- (void)viewDidLoad { [super viewDidLoad]; UIView *view = [[UIView alloc] init]; // 系统自动布局必需将 translatesAutoresizingMaskIntoConstraints 属性置为 NO view.translatesAutoresizingMaskIntoConstraints = NO; view.backgroundColor = [UIColor blackColor]; [self.view addSubview:view]; // 添加约束 // 水平约束 [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[view]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)]]; // 垂直约束 [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[view]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)]]; }
介绍
Masonry是一个轻量级的布局框架,拥有自己的描述语法,采用优雅的链式语法封装自动布局,简洁明了,可读性高,而且同时支持iOS和Max OS X。
Masonry是一个用代码写iOS或OS界面的库,可以代替Auto layout。
Masonry布局,无需将属性translatesAutoresizingMaskIntoConstraints置为NO,因为Masonry已经帮我们执行了这一步。
Masonry 常用属性
@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; /**< 中心点X */ @property (nonatomic, strong, readonly) MASConstraint *centerY; /**< 中心点Y */ @property (nonatomic, strong, readonly) MASConstraint *baseline; /**< 文本基线 */
Masonry 安装
手动安装
github地址:https://github.com/SnapKit/Masonry
安装后导入头文件:#import "Masonry.h"
cocoapods安装
pod ‘Masonry’, ‘~> 0.6.2’
安装后导入头文件:#import <Masonry.h>
Masonry 实用详解
mas_makeConstraints是给view添加约束,约束有几种,分别是边距,宽,高,左上右下距离,基准线。添加过约束后可以有修正,修正有offset(位移)修正和multipliedBy(倍率)修正。
语法一般是make.equalTo or make.greaterThanOrEqualTo or make.lessThanOrEqualTo + 倍数和位移修正。
Masonry 的基本使用
- (void)viewDidLoad { [super viewDidLoad]; // 使用 Masonry 布局,基本可以抛弃 CGRectMake 了,直接初始化即可。 UIView *view = [[UIView alloc] init]; view.backgroundColor = [UIColor darkGrayColor]; // 在做布局之前,一定要先将 view 添加到 superview 上,否则会报错。 [self.view addSubview:view]; // mas_makeConstraints 就是 Masonry 的 autolayout 添加函数,将所需的约束添加到block中就行。 [view mas_makeConstraints:^(MASConstraintMaker *make) { // 设置居中 make.center.equalTo(self.view); // 设置宽度为200 make.width.equalTo(@200); // 设置高度为200 make.height.mas_equalTo(200); }]; }
make.left.and.right.equalTo(self.view); make.left.right.equalTo(self.view);
Masonry 使用
视图略小于其父视图
加载一个上边距为20,下、左、右边距为10的黑色视图。
代码展示:
- (void)viewDidLoad { [super viewDidLoad]; UIView *blackView = [[UIView alloc] init]; blackView = [UIColor blackColor]; [self.view addSubview:blackView]; [blackView mas_makeConstraints:^(MASConstraintMaker *make) { // 方法1: // make.edges.equalTo(self.view).with.insets(UIEdgeInsetsMake(20, 10, 10, 10)); // 方法2: // make.top.left.bottom.and.right.equalTo(self.view).with.insets(UIEdgeInsetsMake(20, 10, 10, 10)); // 方法3: // 设置其左侧和父视图偏移10个像素 make.left.equalTo(self.view).with.offset(10); // 设置其右侧和父视图偏移10个像素 make.right.equalTo(self.view).with.offset(-10); // 设置其顶部和父视图偏移20个像素 make.top.equalTo(self.view).with.offset(20); // 设置其尾部和父视图偏移10个像素 make.bottom.equalTo(self.view).with.offset(-10); }]; }
现在屏幕上已经显示一个黑色视图、距离屏幕上方20个像素,左、右、下方各10个像素了。
视图居中
代码展示:
- (void)viewDidLoad { [super viewDidLoad]; // 黑色视图 UIView *blackView = [[UIView alloc] init]; blackView.backgroundColor = [UIColor blackColor]; [self.view addSubview:blackView]; [blackView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.view).with.insets(UIEdgeInsetsMake(20, 10, 10, 10)); }]; // 棕色视图 UIView *brownView = [[UIView alloc] init]; brownView.backgroundColor = [UIColor brownColor]; [blackView addSubview:brownView]; [brownView mas_makeConstraints:^(MASConstraintMaker *make) { // 设置其中心点为父视图的中心点 make.center.mas_equalTo(blackView); // 设置其宽度为父视图的宽度 make.width.mas_equalTo(blackView); // 设置其高度为300 make.height.mas_equalTo(300); }]; }
现在,一个宽度与黑色视图等宽,高度为300,并且在黑色视图正中间的棕色视图已经显示出来了。
并排布局
在棕色视图中并排显示红色视图、紫色视图,红色视图左侧距离父视图20像素,紫色视图右侧距离父视图20像素,紫色视图与红色视图等高,等宽。
代码展示:
- (void)viewDidLoad { [super viewDidLoad]; // 黑色视图 UIView *blackView = [[UIView alloc] init]; blackView.backgroundColor = [UIColor blackColor]; [self.view addSubview:blackView]; [blackView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.view).with.insets(UIEdgeInsetsMake(20, 10, 10, 10)); }]; // 棕色视图 UIView *brownView = [[UIView alloc] init]; brownView.backgroundColor = [UIColor brownColor]; [blackView addSubview:brownView]; [brownView mas_makeConstraints:^(MASConstraintMaker *make) { // 设置其中心点为父视图的中心点 make.center.mas_equalTo(blackView); // 设置其宽度为父视图的宽度 make.width.mas_equalTo(blackView); // 设置其高度为300 make.height.mas_equalTo(300); }]; // 红色视图 UIView *redView = [[UIView alloc] init]; redView.backgroundColor = [UIColor redColor]; [brownView addSubview:redView]; // 紫色视图 UIView *purpleView = [[UIView alloc] init]; purpleView.backgroundColor = [UIColor purpleColor]; [brownView addSubview:purpleView]; // 布局红色视图、紫色视图 [redView mas_makeConstraints:^(MASConstraintMaker *make) { // 设置其位于父视图的Y轴的中心位置 make.centerY.mas_equalTo(brownView); // 设置其左侧与父视图偏移20像素 make.left.mas_equalTo(brownView).offset(20); // 设置其高度为260 make.height.mas_equalTo(260); // 设置其宽度与紫色视图等宽 make.width.mas_equalTo(purpleView); }]; [purpleView mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.mas_equalTo(brownView.mas_centerY); make.left.equalTo(redView.mas_right).with.offset(20); make.right.equalTo(brownView.mas_right).with.offset(-20); make.height.mas_equalTo(redView); make.width.equalTo(redView); }]; }
- (void)viewDidLoad { [super viewDidLoad]; // 初始化视图 UIView *view1 = [[UIView alloc] init]; view1.backgroundColor = [UIColor redColor]; [self.view addSubview:view1]; UIView *view2 = [[UIView alloc] init]; view2.backgroundColor = [UIColor yellowColor]; [self.view addSubview:view2]; UIView *view3 = [[UIView alloc] init]; view3.backgroundColor = [UIColor greenColor]; [self.view addSubview:view3]; // 布局视图 [view1 mas_makeConstraints:^(MASConstraintMaker *make) { // 设置中心点 make.centerY.mas_equalTo(self.view); // 设置左侧距离父视图10像素 make.left.equalTo(self.view).offset(10); // 设置右侧距离和view2的左侧相距10像素 make.right.equalTo(view2.mas_left).offset(-10); // 设置高度 make.height.mas_equalTo(200); // 设置宽度和view2以及view3相等 make.width.equalTo(@[view2, view3]); }]; [view2 mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.mas_equalTo(self.view); make.height.mas_equalTo(view1); make.width.equalTo(@[view1, view3]); }]; [view3 mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.mas_equalTo(self.view); make.left.equalTo(view2.mas_right).offset(10); make.right.equalTo(self.view).offset(-10); make.height.mas_equalTo(view1); make.width.equalTo(@[view1, view2]); }]; }
转载参考
http://blog.csdn.net/hierarch_lee/article/details/48295459