转自:https://github.com/potato512/SYDemo_Masonry
#常用方法
1 添加约束 mas_makeConstraints
2 更新约束、也可以添加新约束 mas_updateConstraints
3 重置之前的约束 mas_remakeConstraints
#使用注意事项
1、使用autolayout之前,一定要将视图添加到父视图上,否则会报错。
2、使用autolayout时,不能同事对同一个视图使用mas_makeConstraints,否则会报错。
3、使用autolayout时,如果非要修改约束时,可使用mas_updateConstraints进行修改更新。
4、使用autolayout时,可使用mas_remakeConstraints清除之前的所有约束,仅保留最新的约束。
5、mas_equal支付的数据类型包括:NSNumber,CGPoint,CGSize,UIEdgeInsets。
6、equalTo与mas_equalTo的区别:equalTo比较的是view,而mas_equalTo比较的是值。
7、边界中顶部、左侧边界的数值为正整数;而底部、右侧边界的数值为负整数(原因在于计算的是绝对的数值,即计算的底部,或右侧边界的数值时,相对的视图底部高度,或右侧宽度,所以要负数)。
8、多个视图的父视图相同时,须先实例化多个视图,且多个视图都添加到视图后才进行约束设置。
9、更新约束后,需要刷新UI布局时,需要调用下面的方法
情况1:实例化UI后,先通过mas_makeConstraints添加约束,然后再通过mas_updateConstraints修改更新某一个约束,然后再调用layoutIfNeeded
情况2:实例化UI后,先通过mas_makeConstraints添加约束,然后再通过mas_remakeConstraints重置所有约束,然后再调用layoutIfNeeded
情况3:实例化UI后,暂不添加约束,后通过updateViewConstraints方法里添加约束mas_updateConstraints,然后再调用setNeedsUpdateConstraints、layoutIfNeeded
#使用设置
1、居中设置
垂直居中:make.centerY.mas_equalTo(self.window.mas_centerY)
水平居中:make.centerX.mas_equalTo(self.window.mas_centerX)
全屏居中:make.center.equalTo(self.window)
2、边界设置
上边界:make.top.equalTo(self.window).with.offset(15.0)
左边界:make.left.equalTo(self.window).with.offset(15.0)
下边界:make.bottom.equalTo(self.window).with.offset(-15.0)
右边界:make.right.equalTo(self.window).with.offset(-15.0)
或:
上边界:make.top.mas_equalTo(15.0)
左边界:make.left.mas_equalTo(15.0)
下边界:make.bottom.mas_equalTo(-15.0)
右边界:make.right.mas_equalTo(-15.0)
或:
上边界、左边界:make.top.left.mas_equalTo(15.0)
下边界、右边界:make.bottom.right.mas_equalTo(-15.0)
或:
make.top.left.bottom.and.right.equalTo(self.window).with.insets(UIEdgeInsetsMake(15.0,15.0,15.0,15.0))
或:
make.edges.equalTo(self.window).with.insets(UIEdgeInsetsMake(15.0,15.0,15.0,15.0))
与另一个视图的边界间距设置
与另一个视图右部边界间距:
make.right.mas_equalTo(currentView.mas_left).offset(10.0);
与另一个视图底部边界间距:
make.top.mas_equalTo(currentView.mas_bottom).offset(10.0);
3、equalTo与mas_equalTo有什么区别?
equalTo比较的是view
mas_equalTo比较的是数值
4、and和with?
什么事情都没做,只是增加代码可读性。
5、倍数设置
设置宽度为self.view的一半,multipliedBy是倍数的意思,也就是,使宽度等于self.view宽度的0.5倍
make.width.equalTo(self.view.mas_width).multipliedBy(0.5);
设置高度为self.view高度的一半
make.height.equalTo(self.view.mas_height).multipliedBy(0.5);
6、大小设置
(1)宽:
make.width.equalTo(self.view.mas_width).multipliedBy(0.5);
或:make.width. mas_equalTo(320.0).multipliedBy(0.5);
或:make.width. mas_equalTo(160.0);
(2)高:make.height.equalTo(self.view.mas_height).multipliedBy(0.5);
或:make.height. mas_equalTo(320.0).multipliedBy(0.5);
或:make.height. mas_equalTo(160.0);
(3)size:make.size. mas_equalTo(CGSizeMake(300.0,50.0));
或:make.size.equalTo(view);
或:make.size.mas_equalTo(CGSizeMake(150.0,50.0)).multipliedBy(0.5);
或:make.edges.equalTo(self.view);
#疑问:
1、UILable如何设置多行显示?
2、UITextView如何设置自适应多行显示? UITextView实始化时,设置的约束只能显示一行,随着输入内容的不断增多,可以在代理方法中实现高度自适应,即重新更新高度约束。
3、UISCrollView如何设置contentSize?
通过过渡视图设置。
(1)containerView为crollView的过渡子视图(垂直设置原理说明);
(2)containerView相对于crollView的约束为make.top.left.bottom.and.right.equalTo(crollView).with.insets(UIEdgeInsetsZero); make.width.equalTo(crollView);
(3)containerView的多个子视图label,且containerView的高度约束最终为最后一个子视图label:make.bottom.equalTo(label.mas_bottom);
(4)containerView的高度约束,即为crollView的垂直方向的高度约束。
4、UITableView如何设置UITableViewCell的高度?
在自自定义,或系统的UITableViewCell中,根据数据model显示,或隐藏UI子视图,以及UILabel的自适应显示(需要先设置多行自适应显示的属性)。同时,在代理方法中设置计算返回的高度。
5、如何处理动画效果?
实现动画效果,即修改更新UI的约束即可,可以使用mas_updateConstraints更新某个约束,也可以使用mas_remakeConstraints清除之前的约束,重新设置所有约束。但不管何种方式,都需要UI所有的父视图调用方法"- (void)layoutIfNeeded;"。
6、如何动态修改约束
使用mas_updateConstraints修改更新某一个约束
使用mas_remakeConstraints,清除之前的所有约束,重新添加约束
7、如何获取约束里设置的值,或是获取约束对象的frame
8、约束中edge、size设置的区别
设置某个子视图的大小与其父视图相同大小时,如frame中设置:label.frame = self.view.bounds;,可以使用size约束,也可以使用edges约束。 *(1)size约束(可能会出现约束异常):make.size.equalTo(self.view); *(2)edges约束(建议使用此方法):make.edges.equalTo(self.view);