Masonry使用入门
目录
一、基本用法2
二、扩展用法3
三、使用注意事项5
四、适配iPhoneX9
五、兼容性问题13
一、 基本用法:
1、 Masonry基本属性:
2、 设置约束基本方法:
· (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker*make))block;
· (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker*make))block;
· (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker*make))block;
[if !supportLists]· [endif]2.1、mas_makeConstraints 只负责添加约束, AutoLayout不能同时存在两条针对同一对象的约束否,虽然不会报错但是可能会引起约束冲突
[if !supportLists]· [endif]2.2、mas_updateConstraints 更新约束、也可以添加约束,会更新在block中出现的约束,不会导致出现两个相同约束的情况
[if !supportLists]· [endif]2.3、mas_remakeConstraints 清除之前所有的约束只保留当前新的约束
基本属性使用,代码示例:
针对控件A,在不同约束情况下使用不同的方法,效果也有所区别,如下代码的写法存在问题:
总结如下表:
makeUpdateremake
已有某类型约束,再添加更新(会重复添加约束,可能导致约束冲突)更新更新
没有某类型约束,再添加更新更新(只更新已有的约束类型,否则会导致约束异常)更新
是否删除已有约束不删除不删除全部删除
总结:make一般用来第一次添加约束;update用来更新已有的约束;remake不仅会增加最新的约束还会干掉所有已有的老约束。
[if !supportLists]二、 [endif]扩展用法:
1、约束的优先级
.priority允许你指定一个精确的优先级,数值越大优先级越高.最高1000..
priorityHigh等价于UILayoutPriorityDefaultHigh .优先级值为750..
priorityMedium介于高优先级和低优先级之间,优先级值在250~750之间..
priorityLow等价于UILayoutPriorityDefaultLow , 优先级值为250.
Greater/Less 一般与Priority 一起使用,为一个 Constraint 设置了 Greater/Less 后,调整Priority。如果Constraint 的 Priority 的值越大,程序优先设置它的 Constraint 效果,优先级可以在约束的尾部添加:
2、按比例设置视图约束:
[if !supportLists]· [endif]multipler属性表示约束值为约束对象的乘因数, dividedBy属性表示约束值为约束对象的除因数,可用于设置view的宽高比。
代码如下:
3、baseline的使用:
具体用法和含义参考如下代码:
红色区域:self.noContentLabel
白色区域:self.containerView
实现效果图:
[if !supportLists]三、 [endif]使用注意事项:
注意点1:
使用 mas_makeConstraints方法的元素必须事先添加到父元素的中,例如[self.view
addSubview:view];。即被约束的控件都必须有父控件
注意点2:
mas_equalTo 和 equalTo 区别:mas_equalTo比equalTo多了类型转换操作,目前支持CGSize、CGPoint、UIEdgeinsets,mas_equalTo是equalTo的封装。一般来说,大多数时候两个方法都是 通用的。
equalTo,参数是(id)对象类型,一般是视图或mas_top等坐标系对象。方法源码如下:
mas_equalTo,基本功能和上面一样,不过多了参数类型转换的功能,意味着支持更多类型的数据。方法源码如下(下图只展示了一部分,若要查询该方法所支持的所有类型,参考MASUtilities.h):
用法代码示例:
1)对于基本数据类型
2)对于复杂类型:
3)一般情况下只导入头文件”Masonry”即可,但是导入以下宏定义会对使用方法有以下影响:
注意点3:
方法with和and,这两个方法其实没有做任何操作,方法只是返回对象本身,这这个方法的左右完全是为了方法写的时候的可读性 。
是完全一样的,但是明显的加了and方法的语句可读性 更好点。
注意点4:
方法的简化,如下:
注意点5:
其中leading与left,trailing与right在正常情况下是等价的,但是当一些布局是从右至左时(比如阿拉伯文) 则会对调,因此直接用left和right就好了,如果混用可能会出现崩溃等异常情况
注意点6:
设置约束的方法虽然是block,可能会想防止block循环引用,而使用弱引用(这个想法是错误的,没必要)。在这里的block是局部的引用,block内部引用self不会造成循环引用。因此,不用写__weak typeof(self) weakSelf = self;
注意点7:
约束项发生冲突的时候,定位的手段。可以设置视图view的mas_key来定位是那个view。
若是某个控件存在冲突或重复的约束,通过在Xcode控制台过滤关键字“noContentLabel”、“noContentImage”,可以看到对应控件会在控制台上打印冲突的约束。
[if !supportLists]四、 [endif]适配iphoneX:
注:需要Masonry版本不低于V1.1.0(https://github.com/SnapKit/Masonry)
1、新增方法、属性:
2、用法示例:
注:新增了inset()方法,和insets()方法的区别是:inset()方法的参数类型是CGFloat类型,而insets()的参数类型是UIEdgeInsets。大部分情况下inset完全可以替代insets,而且简单方便。
1)在iOS11中新增了安全区域safe Area,在Masonry的更新中,相应增加了以上方法属性。
如下图(iphoneX机型,灰色为安全区域):
灰色区域的约束,参考以下代码:
以上代码在非iPhoneX机型上执行后,则不会出现左右底部的白色安全区域(可以直接放心食用,Masonry框架内部已做处理)。
注:mas_safeAreaLayoutGuide方法只能在iOS11及以上的系统执行,否则会导致崩溃。
2)底部功能栏、普通控件如何在所有机型上(包括iPhoneX)布局呢?
如下图:
在需要预留安全区域的地方都有安全区域,可以参考以下代码:
综上,可以看出,在同一个界面中,只要设定一个基准控件,执行一次mas_safeAreaLayoutBuide方法来设置好left、right约束就好了,其他需要的控件左右约束和它保持一致,就可以在横竖屏下、任意机型上完美的适配了。
Bottom约束可以参考上面绿色视图的示例代码,top约束同理。
[if !supportLists]五、 [endif]兼容性问题
目前Masonry(Object-c)最新版本V1.1.0(https://github.com/SnapKit/Masonry),目前在iOS8-iOS11系统上均可以兼容
参考链接:
http://www.cocoachina.com/ios/20160808/17305.html
https://www.jianshu.com/p/1d1a1165bb04
网友评论