Swift 下的Mansory
2017-04-28 本文已影响0人
lxl125z
Mansory的常用类
Mansory 是对NSLayoutConstraint的封装。
Swift语言的,最好使用SnapKit布局框架,但是如果OC和Swift混合编码的话为了兼容OC,还是会用到Mansory框架。如果是纯Swift开发的话,尽量用
pod 'SnapKit'
,同一个作者开发的。
使用mas_makeConstrains方法的元素必须事先添加到父视图中
对View的扩展类
//约束方法
func mas_makeConstraints(_ block: ((MASConstraintMaker?) -> Swift.Void)!) -> [Any]!
func mas_updateConstraints(_ block: ((MASConstraintMaker?) -> Swift.Void)!) -> [Any]!
func mas_remakeConstraints(_ block: ((MASConstraintMaker?) -> Swift.Void)!) -> [Any]!
//计算型属性
var mas_left: MASViewAttribute! { get }
//其他方法
//找到共同的父视图
func mas_closestCommonSuperview(_ view: UIView!) -> Self!
……
方法比较:
-
mas_makeConstraints
只负责添加约束 AutoLayout不能同时存在两条针对同一对象的约束否则会报错 -
mas_updateConstraints
针对上面的情况 会更新在block中出现的约束 不会导致出现两个相同约束的情况 -
mas_remakeConstraints
清除之前所有的约束只保留新的约束
MASConstraintMaker类
open var left: MASConstraint! { get }
open var top: MASConstraint! { get }
……
open var edges: MASConstraint! { get }
open var size: MASConstraint! { get }
open var center: MASConstraint! { get }
(默认是父视图的中心,设置CGpoint是设置偏移中心点的值)
MASConstraint类
//insert
func insets() -> ((UIEdgeInsets) -> MASConstraint?)!
func centerOffset() -> ((CGPoint) -> MASConstraint?)!
func offset() -> ((CGFloat) -> MASConstraint?)!
func multipliedBy() -> ((CGFloat) -> MASConstraint?)!
//设置优先级
func priority() -> ((MASLayoutPriority) -> MASConstraint?)!
//常用方法
func equalTo() -> ((Any?) -> MASConstraint?)!
func greaterThanOrEqualTo() -> ((Any?) -> MASConstraint?)!
func lessThanOrEqualTo() -> ((Any?) -> MASConstraint?)!
func with() -> MASConstraint!
……
func centerYWithinMargins() -> MASConstraint!
//增加程序可读性
func and() -> MASConstraint!
func with() -> MASConstraint!
//直接设置
func setInsets(_ insets: UIEdgeInsets)
func setSizeOffset(_ sizeOffset: CGSize)
……
基本使用
make 是一个MASConstraintMaker类的实例,然后调用left后,获取MASConstraint类的实例,然后调用
equalTo()
方法后,返回一个(Any?) -> MASConstraint?
的闭包,然后直接在后面拼接(50)
返回MASConstraint的实例(应该和上述实例相同),然后继续设置约束。
属性比较
1、mas_equalTo 和equalTo
mas_equalTo是个宏定义,mas_equalTo
是equalTo
的扩展,可完全替代equalTo
-
equalTo()(@3)
必须转换成对象形式; - 支持类型转换,支持复杂类型。是对
equalTo
的封装。支持CGSize
CGPoint
NSNumber
UIEdgeinsets
。
ps:swift中似乎没有特别的差异,编译器转化成了下面的方法:
open func equalTo() -> ((Any?) -> MASConstraint?)!
2、leftMargin和left
NSLayoutAttributeLeft指的是控件的左边,具体来说是控件的最左边;NSLayoutAttributeLeftMargin也是指控件的左边,但是不是最左边,具体距离最左边有多大的Margin和控件的layoutMargins有关。
ps:默认是{8,8,8,8},但是如果是viewController的root view则top和bottom的margins为0,左右margins可能是16或者20,这取决于当前的view尺寸,并且不能修改。
3、and和with
这里的and和with都没有具体操作只是拿来增加程序可读性
PS:最后加一段SnapKit的代码
backView.snp.makeConstraints { (make) in
make.left.equalToSuperview().offset(50)
make.right.equalToSuperview().offset(-50)
make.top.equalToSuperview().offset(50)
make.height.equalTo(backView.snp.width)
}