Masonry使用入门

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的宽高比。

代码如下:

3baseline的使用:

具体用法和含义参考如下代码:

红色区域: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

https://www.jianshu.com/p/551eac8b9dbf

https://www.jianshu.com/p/e3162f3c61fa

你可能感兴趣的:(Masonry使用入门)