masonry git地址:https://github.com/SnapKit/Masonry
一、常用使用方法
//.分别设置各个相对边距(superview为view的父类视图,同下)
make.left.mas_equalTo(superView.mas_left).mas_offset(10);
make.right.mas_equalTo(superView.mas_right).mas_offset(-10);
make.top.mas_equalTo(superView.mas_top).mas_offset(10);
make.bottom.mas_equalTo(superView.mas_bottom).offset(-10);
//直接连接使用left大于等于每个值
make.left.mas_greaterThanOrEqualTo(10);
//设置宽和高
make.width.mas_equalTo(60);
make.height.mas_equalTo(60);
//.设置center和宽高比
make.center.mas_equalTo(superView);
make.width.mas_equalTo(superView).multipliedBy(1.00/3);
make.height.mas_equalTo(superView).multipliedBy(0.25);
//.关于约束优先级,此处要注意约束冲突的问题,同一约束优先级大的生效
make.left.mas_equalTo(10);
make.left.mas_equalTo(view.superview.mas_left).offset(10);
make.left.mas_equalTo(20).priority(600);
make.left.mas_equalTo(40).priorityHigh();
make.left.mas_equalTo(60).priorityMedium();
make.left.mas_equalTo(80).priorityLow();
//.如果你想让view的(x坐标)左边大于等于label的左边,以下两个约束的写法效果一样
make.left.greaterThanOrEqualTo(label);
make.left.greaterThanOrEqualTo(label.mas_left);
约束的链式写法中,不包含其他相对的view时,默认为其superview,即make.left.mas_equalTo(100);等价于make.left.mas_equalTo(view.superview.mas_left).offset(10);和make.left.mas_equalTo(view.superview).offset(10);
自动布局允许使用常量去设置宽或高,如果你想通过一个数字设置一个view的最小和最大的width,可以用equality blocks,如下:
//width >= 100 && width <= 200
make.width.greaterThanOrEqualTo(@100);
make.width.lessThanOrEqualTo(@200);
然而自动布局不允许对齐属性的约束(如:left,right,centerY等)设置为常量值,你可以使用NSNumber来设置相对于父类view这些约束属性,如:
// creates view.left = view.superview.left + 10
make.left.lessThanOrEqualTo(@10)
如果你不想使用NSNumber来设置,也可以用如下结构来创建你的约束,如:
make.top.mas_equalTo(42);
make.height.mas_equalTo(20);
make.size.mas_equalTo(CGSizeMake(50, 100));
make.edges.mas_equalTo(UIEdgeInsetsMake(10, 0, 10, 0));
make.left.mas_equalTo(view).mas_offset(UIEdgeInsetsMake(10, 0, 10, 0));
以上用法默认添加mas_前缀,如果你不想添加此前缀,但还想使用常量值设置约束,需要在导入Masonry头文件前,设置宏定义MAS_SHORTHAND_GLOBALS
二、更加便利的约束方法
Masonry提供了一些便利的方法供我们同时创建多个不同的约束,他们被称为MASCompositeConstraints,如:
edges
// 使一个view的top, left, bottom, right 等于view2的
make.edges.equalTo(view2);
//相对于superviewde上左下右边距分别为5,10,15,20
make.edges.equalTo(superview).insets(UIEdgeInsetsMake(5, 10, 15, 20))
size
// 使得宽度和高度大于等于 titleLabel
make.size.greaterThanOrEqualTo(titleLabel)
// 相对于superview宽度大100,高度小50
make.size.equalTo(superview).sizeOffset(CGSizeMake(100, -50))
center
//中心与button1对齐
make.center.equalTo(button1)
//水平方向中心相对向左偏移5,竖直方向中心向下偏移10
make.center.equalTo(superview).centerOffset(CGPointMake(-5, 10))
// 除了top,所有的边界与superview对齐
make.left.right.and.bottom.equalTo(superview);
make.top.equalTo(otherView);
三、Layout
setNeedsLayout:告知页面需要更新,但是不会立刻开始更新。执行后会立刻调用layoutSubviews。
layoutIfNeeded:告知页面布局立刻更新。所以一般都会和setNeedsLayout一起使用。如果希望立刻生成新的frame需要调用此方法,利用这点一般布局动画可以在更新布局后直接使用这个方法让动画生效。
layoutSubviews:系统重写布局
setNeedsUpdateConstraints:告知需要更新约束,但是不会立刻开始
updateConstraintsIfNeeded:告知立刻更新约束
updateConstraints:系统更新约束
给view添加约束时,必须已经添加到其superview上面
手写布局时,合理使用约束,尽量约束冲突问题
因为iOS中原点在左上角所以注意使用offset时注意right和bottom用负数