美文网首页
Masonry使用入门

Masonry使用入门

作者: 佐鼬_1282 | 来源:发表于2020-03-31 14:25 被阅读0次

    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使用入门

          本文链接:https://www.haomeiwen.com/subject/lcnabxtx.html