iOS 屏幕适配用的比较多的第三方
Masonry 本质是对AutoLayout的进行的封装
先看一下AutoLayout
- 主要思想:将基于约束系统的布局规则转化为表示规则的视图几何参数。每个都是1元1次线性方程。
在数学层次上比较好解释:表示视图布局关系的线性方程组Y = kx + C; - 特点:更多关注视图之间的关系,而非尺寸的具体值。
- 每一个约束需要包含的内容:
- Item1 & Item2 : 对这两个视图进行布局
- Attribute1,Attribute2(NSLayoutAttribute类型):表示这2个视图满足什么样的约束,可以有多个。
- Relationship(NSLayoutRelation类型):约束关系,可以是=、>=、<=。
e.g.
Item2的某个位置属性 = Multiplier(倍数) * Item1的某个位置属性 + Constant(常量Float类型)
- 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。可以保持视图顺序,使用负数;也可以保持数值为正数,调换视图顺序。
- 约束关系
Auto Layout提供三种约束关系:
>= NSLayoutRelationLessThanOrEqual、
= NSLayoutRelationEqual、
<= NSLayoutRelationGreaterThanOrEqual
即线性方程不一定是等式,也可以是不等式。
-
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 标记需要进行重新布局
-
equalTo和mas_equalTo
equalTo() 参数是对象类型,如果要传数字,则转换为 NSNumber 类型。一般传控件的相对位置例如 make.left.equalTo(gray1.mas_right);
mas_equalTo() 参数可以传递基础数据类型对象,一般传具体数值。CGPoint、CGSize、UIEdgeInsets 例如 make.top.mas_equalTo(10);
width() 用来表示宽度,例如代表view的宽度
mas_width() 用来获取宽度的值。和上面的区别在于,一个代表某个坐标系对象,一个用来获取坐标系对象的值
-
equalTo和mas_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);
- 方向的定义
上左为正,下右为负。视图的左上角为原点。
参考链接:
https://www.jianshu.com/p/587efafdd2b3
http://ddrv.cn/a/252459