iOS开发-Masonry简易教程

简介:

关于iOS布局自动iPhone6之后就是AutoLayOut,AutoLayOut固然非常好用,不过有时候我们需要在页面手动进行页面布局,VFL算是一种选择,如果对VFL不是很熟悉可以参考iOS开发-VFL(Visual format language)和AutolayoutVFL不复杂,理解起来很容易,实际开发中用的特别熟还好,要是第一次看估计要花点功夫才能搞定。Masonry算是VFL的简化版,用的人比较多,之前项目中用过一次,对手动写页面的开发来说算是福利。

 基础知识

首先我们看一个常见的问题将一个子View放在的UIViewController的某个位置,通过设置边距来实现,效果如下:

如果通过VFL我们代码会是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
UIView *superview                               = self.view;
 
UIView *view1                                   = [[UIView alloc] init];
view1.translatesAutoresizingMaskIntoConstraints = NO;
view1.backgroundColor                           = [UIColor redColor];
[superview addSubview:view1];
 
UIEdgeInsets padding                            = UIEdgeInsetsMake(200, 50, 200, 50);
 
[superview addConstraints:@[
 
                             //约束
                             [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],
 
                             ]];

只是简单的设置了一个边距,如果视图的关系比较复杂,维护起来会是一个很痛苦的事情,我们看一下Masonry是如何实现的,导入Masonry.h头文件,约束的代码:

1
2
3
4
5
6
7
8
9
UIView  *childView=[UIView  new ];
[childView setBackgroundColor:[UIColor redColor]];
//先将子View加入在父视图中
[self.view addSubview:childView];
__weak  typeof (self) weakSelf = self;
UIEdgeInsets padding = UIEdgeInsetsMake(200, 50, 200, 50);
[childView mas_makeConstraints:^(MASConstraintMaker *make) {
     make.edges.equalTo(weakSelf.view).with.insets(padding);
}];

通过mas_makeConstraints设置边距有种鸟枪换炮的感觉,我们即将开启一段新的旅程,可以紧接着看下面比较实用的功能~

实用知识

1.View设置大小 

1
2
3
4
5
6
7
8
9
10
11
UIView  *childView=[UIView  new ];
[childView setBackgroundColor:[UIColor redColor]];
//先将子View加入在父视图中
[self.view addSubview:childView];
__weak  typeof (self) weakSelf = self;
[childView mas_makeConstraints:^(MASConstraintMaker *make) {
     //设置大小
     make.size.mas_equalTo(CGSizeMake(100, 100));
     //居中
     make.center.equalTo(weakSelf.view);
}];

效果如下:

  

 

这里友情其实一个小内容,目前我们设置约束都是通过mas_makeConstraints用来创建约束,mas_updateConstraints用来更新约束,mas_remakeConstraints重置约束,清除之前的约束,保留最新的约束,如果想深入解释下,可以阅读下面的英文解释~

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
  *  Creates a MASConstraintMaker with the callee view.
  *  Any constraints defined are added to the view or the appropriate superview once the block has finished executing
  *
  *  @param block scope within which you can build up the constraints which you wish to apply to the view.
  *
  *  @return Array of created MASConstraints
  */
- (NSArray *)mas_makeConstraints:( void (^)(MASConstraintMaker *make))block;
 
/**
  *  Creates a MASConstraintMaker with the callee view.
  *  Any constraints defined are added to the view or the appropriate superview once the block has finished executing.
  *  If an existing constraint exists then it will be updated instead.
  *
  *  @param block scope within which you can build up the constraints which you wish to apply to the view.
  *
  *  @return Array of created/updated MASConstraints
  */
- (NSArray *)mas_updateConstraints:( void (^)(MASConstraintMaker *make))block;
 
/**
  *  Creates a MASConstraintMaker with the callee view.
  *  Any constraints defined are added to the view or the appropriate superview once the block has finished executing.
  *  All constraints previously installed for the view will be removed.
  *
  *  @param block scope within which you can build up the constraints which you wish to apply to the view.
  *
  *  @return Array of created/updated MASConstraints
  */
- (NSArray *)mas_remakeConstraints:( void (^)(MASConstraintMaker *make))block;

 

2.设置高度,这里设置左右边距,因此不设置宽度,如果想单独设置width可参考高度的设置方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
UIView  *childView=[UIView  new ];
[childView setBackgroundColor:[UIColor greenColor]];
//先将子View加入在父视图中
[self.view addSubview:childView];
__weak  typeof (self) weakSelf = self;
[childView mas_makeConstraints:^(MASConstraintMaker *make) {
     //距离顶部44
     make.top.equalTo(weakSelf.view.mas_top).with.offset(44);
     //距离左边30
     make.left.equalTo(weakSelf.view.mas_left).with.offset(30);
     //距离右边30,注意是负数
     make.right.equalTo(weakSelf.view.mas_right).with.offset(-30);
     //高度150
     make.height.mas_equalTo(@150);
}];

 

3.子视图之间的位置设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
UIView  *childView=[UIView  new ];
[childView setBackgroundColor:[UIColor greenColor]];
//先将子View加入在父视图中
[self.view addSubview:childView];
__weak  typeof (self) weakSelf = self;
[childView mas_makeConstraints:^(MASConstraintMaker *make) {
     //距离顶部44
     make.top.equalTo(weakSelf.view.mas_top).with.offset(44);
     //距离左边30
     make.left.equalTo(weakSelf.view.mas_left).with.offset(30);
     //距离右边30,注意是负数
     make.right.equalTo(weakSelf.view.mas_right).with.offset(-30);
     //高度150
     make.height.mas_equalTo(@150);
}];
//地址:http://www.cnblogs.com/xiaofeixiang/
UIView *nextView=[UIView  new ];
[nextView setBackgroundColor:[UIColor redColor]];
[self.view addSubview:nextView];
[nextView mas_makeConstraints:^(MASConstraintMaker *make) {
     make.top.equalTo(childView.mas_bottom).with.offset(30);
     make.right.equalTo(childView.mas_right).with.offset(-30);
     make.width.mas_equalTo(@100);
     make.height.mas_equalTo(@100);
}];

4.链式写法,算是一个便利的写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
     UIView  *childView=[UIView  new ];
     [childView setBackgroundColor:[UIColor greenColor]];
     //先将子View加入在父视图中
     [self.view addSubview:childView];
     __weak  typeof (self) weakSelf = self;
     [childView mas_makeConstraints:^(MASConstraintMaker *make) {
         make.top.and.left.mas_equalTo(weakSelf.view).with.offset(100);
         make.bottom.and.right.mas_equalTo(weakSelf.view).with.offset(-100);
         //第二种写法更简单,相对于就是父视图
//        make.top.and.left.mas_equalTo(100);
//        make.bottom.and.right.mas_equalTo(-100);
     }];
     
     UILabel *label=[UILabel  new ];
     [label setText: @"博客园-FlyElephant" ];
     [label setTextColor:[UIColor redColor]];
     [label setTextAlignment:NSTextAlignmentCenter];
     [self.view addSubview:label];
     [label mas_makeConstraints:^(MASConstraintMaker *make) {
         make.left.mas_equalTo(weakSelf.view).with.offset(10);
         make.height.mas_equalTo(20);
         make.right.mas_equalTo(weakSelf.view).with.offset(-10);
         make.bottom.mas_equalTo(weakSelf.view).with.offset(-50);
     }];

 

网上关于Masonry的教程很多,给的例子的也很多,这几种情况基本上满足了开发中的需求,不会有太多的出入,算是一个简易版的教程,Masonry的中属性和iOS中的属性是有对应的关系,不过因为很简单,基本上没怎么看,下图是一个对照关系:

 本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/5127825.html,如需转载请自行联系原作者


相关文章
|
1月前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
85 3
|
1月前
|
iOS开发 开发者
【教程】苹果 iOS 证书制作教程
【教程】苹果 iOS 证书制作教程
|
1月前
|
iOS开发 开发者
一键制作 iOS 上架 App Store 描述文件教程
一键制作 iOS 上架 App Store 描述文件教程
|
2月前
|
开发者 iOS开发
iOS应用上架详细图文教程(上)
App Store作为苹果官方的应用商店,审核严格周期长一直让用户头疼不已,很多app都“死”在了审核这一关,那我们就要放弃iOS用户了吗?当然不是!本期我们从iOS app上架流程开始梳理,详细了解下iOS app上架的那些事。
|
2月前
|
Linux 数据安全/隐私保护 虚拟化
iOS 打包 IPA 教程
iOS 打包 IPA 教程
|
3月前
|
存储 iOS开发
iOS 开发,如何进行应用的本地化(Localization)?
iOS 开发,如何进行应用的本地化(Localization)?
122 2
|
3月前
|
JSON 前端开发 数据安全/隐私保护
【教程】iOS 手机抓包工具介绍及教程
📱 最近又发现APP Store一款宝藏软件,克魔助手抓包工具,app刚上架,功能不断迭代中,目前18软妹币实惠价可享受终身版!现在是下手的最好时机。
|
6天前
|
API 定位技术 iOS开发
IOS开发基础知识:什么是 Cocoa Touch?它在 iOS 开发中的作用是什么?
【4月更文挑战第18天】**Cocoa Touch** 是iOS和Mac OS X应用的核心框架,包含面向对象库、运行时系统和触摸优化工具。它提供Mac验证的开发模式,强调触控接口和性能,涵盖3D图形、音频、网络及设备访问API,如相机和GPS。是构建高效iOS应用的基础,对开发者至关重要。
11 0
|
22天前
|
开发工具 Swift iOS开发
利用SwiftUI构建动态用户界面:iOS开发新范式
【4月更文挑战第3天】 随着苹果不断推进其软件开发工具的边界,SwiftUI作为一种新兴的编程框架,已经逐渐成为iOS开发者的新宠。不同于传统的UIKit,SwiftUI通过声明式语法和强大的功能组合,为创建动态且响应式的用户界面提供了一种更加简洁高效的方式。本文将深入探讨如何利用SwiftUI技术构建具有高度自定义能力和响应性的用户界面,并展示其在现代iOS应用开发中的优势和潜力。
|
1月前
|
Shell 数据安全/隐私保护 iOS开发
iOS代码混淆教程
iOS代码混淆教程
15 0