Masonry by kino

iOS 屏幕适配用的比较多的第三方

Masonry 本质是对AutoLayout的进行的封装

先看一下AutoLayout

  1. 主要思想:将基于约束系统的布局规则转化为表示规则的视图几何参数。每个都是1元1次线性方程。
    在数学层次上比较好解释:表示视图布局关系的线性方程组Y = kx + C;
  2. 特点:更多关注视图之间的关系,而非尺寸的具体值。
  3. 每一个约束需要包含的内容:
  • Item1 & Item2 : 对这两个视图进行布局
  • Attribute1,Attribute2(NSLayoutAttribute类型):表示这2个视图满足什么样的约束,可以有多个。
  • Relationship(NSLayoutRelation类型):约束关系,可以是=、>=、<=。

e.g.
Item2的某个位置属性 = Multiplier(倍数) * Item1的某个位置属性 + Constant(常量Float类型)

  1. NSLayoutAttribute :可以进行约束的属性如下:
NSLayoutAttributeWidth、NSLayoutAttributeHeight  表示视图的尺寸:宽、高
NSLayoutAttributeLeft、NSLayoutAttributeRight    表示视图的X轴方向的位置:左、右
NSLayoutAttributeLeading、NSLayoutAttributeTrailing  表示视图的X轴方向的位置:前、后
NSLayoutAttributeTop、 NSLayoutAttributeBottom   表示视图Y轴方向的位置:顶、底
NSLayoutAttributeBaseline   表示视图Y轴方向的位置:底部基准线
NSLayoutAttributeCenterX、NSLayoutAttributeCenterY   表示视图的中心点:视图在X轴的中心点、视图在Y轴的中心点


*注意*
只有同类型的约束才能互相做约束
表示尺寸的约束width/height只能与其他视图的width/height做约束,或者与非负常数做约束;
表示Y轴方向的约束属性(top、bottom、baseLine、CenterY)只能与Y轴方向的约束属性做约束;
表示X轴方向的约束属性只能与表示X轴的约束属性做约束,且leading/trailing不可以跟left/right做约束。
-----
leading表示前边、trailing表示后边,在阅读习惯从左到右的语言中,leading相当于left、trailing相当于right。在从右到左的语言中,leading相当于right、trailing相当于left。
-----
baseLine指视图的文本内容底部,该属性只对有文本的控件类型有效(UILabel、UIButton…),并且只有当控件赋值了文本,该约束才能正确布局。文本控件的文字顶部与底部与控件本身会有间隙,当要实现文本底部对齐,可使用该约束属性。
------
Item1、Item2位置问题
从数学的角度,线性方程式两边的Item1、Item2是可以调换位置的。eg:View右边距离父视图superView右边10pt,可以表示为View.right = superView.right – 10 ; 也可以表示为superView.right = View.right + 10。可以保持视图顺序,使用负数;也可以保持数值为正数,调换视图顺序。
  1. 约束关系
    Auto Layout提供三种约束关系:
>=    NSLayoutRelationLessThanOrEqual、
=      NSLayoutRelationEqual、
<=    NSLayoutRelationGreaterThanOrEqual
即线性方程不一定是等式,也可以是不等式。
  1. UILayoutPriority:优先级
    默认创建出来的约束优先级为UILayoutPriorityRequired(1000),称为必需约束;其他优先级小于1000的约束称为可选约束。

举例

NSLayoutConstraint *width = [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:100];

Masonry

1.基础API

mas_makeConstraints()    添加约束,不能同时存在两条针对同一对象的约束否则会报错.使用mas_makeConstrains方法的元素必须事先添加到父视图中
mas_remakeConstraints()  移除之前的约束,重新添加新的约束
mas_updateConstraints()  更新约束,写哪条更新哪条,其他约束不变

- (void)updateConstraintsIfNeeded  调用此方法,如果有标记为需要重新布局的约束,则立即进行重新布局,内部会调用updateConstraints方法
- (void)updateConstraints          重写此方法,内部实现自定义布局过程
- (BOOL)needsUpdateConstraints     当前是否需要重新布局,内部会判断当前有没有被标记的约束
- (void)setNeedsUpdateConstraints  标记需要进行重新布局
  1. equalTomas_equalTo

equalTo() 参数是对象类型,如果要传数字,则转换为 NSNumber 类型。一般传控件的相对位置例如 make.left.equalTo(gray1.mas_right);
mas_equalTo() 参数可以传递基础数据类型对象,一般传具体数值。CGPoint、CGSize、UIEdgeInsets 例如 make.top.mas_equalTo(10);

width() 用来表示宽度,例如代表view的宽度
mas_width() 用来获取宽度的值。和上面的区别在于,一个代表某个坐标系对象,一个用来获取坐标系对象的值

  1. equalTomas_equalTo后面可以跟什么
- multipliedBy()//对传入的值扩大倍数
- dividedBy()//对传入的值缩小倍数

- offset()//对传入的值进行偏移,参考坐标方向。

- insets() //相对于父坐标系 可以+ with
  make.edges.equalTo(self.view).with.insets(UIEdgeInsetsMake(10, 10, 10, 10));
  make.edges.mas_equalTo(0);

 - priorityLow()
 // Masonry为我们提供了三个默认的方法,priorityLow()、priorityMedium()、priorityHigh(),这三个方法内部对应着不同的默认优先级。
 //除了这三个方法,我们也可以自己设置优先级的值,可以通过priority()传参设置。  
 //可以+ with

方法 with 和 and ,这连个方法其实没有做任何操作,方法只是返回对象本身,这这个方法的左右完全是为了方法写的时候的可读性

greaterThanOrEqualTo lessThanOrEqualTo //除了equalTo  和 mas_equalTo 这种相等关系 还有大于小于

以下2种写法效果相同
make.left.greaterThanOrEqualTo(label);
make.left.greaterThanOrEqualTo(label.mas_left);

  1. 方向的定义
    上左为正,下右为负。视图的左上角为原点。

参考链接:
https://www.jianshu.com/p/587efafdd2b3
http://ddrv.cn/a/252459

你可能感兴趣的:(Masonry by kino)