Masonry概述
Masonry,很好用的框架,不需要使用XIB和Storyboard,手写代码简约方便,有很好的可读性。
框架下载地址:https://github.com/Masonry/Masonry
常用属性含义和NSLayoutAttribute的对照(View+MASShorthandAdditions.h)
@property(nonatomic,strong,readonly) MASViewAttribute *left;
NSLayoutAttributeLeft 左
@property(nonatomic,strong,readonly) MASViewAttribute *top;
NSLayoutAttributeTop 顶
@property(nonatomic,strong,readonly) MASViewAttribute *right;
NSLayoutAttributeRight 右
@property(nonatomic,strong,readonly) MASViewAttribute *bottom;
NSLayoutAttributeBottom 底
@property(nonatomic,strong,readonly) MASViewAttribute *leading;
NSLayoutAttributeLeading 首部
@property(nonatomic,strong,readonly) MASViewAttribute *trailing;
NSLayoutAttributeTrailing 尾部
@property(nonatomic,strong,readonly) MASViewAttribute *width;
NSLayoutAttributeWidth宽
@property(nonatomic,strong,readonly) MASViewAttribute *height;
NSLayoutAttributeHeight 高
@property(nonatomic,strong,readonly) MASViewAttribute *centerX;
NSLayoutAttributeCenterX 横向中点
@property(nonatomic,strong,readonly) MASViewAttribute *centerY;
NSLayoutAttributeCenterY 纵向中点
@property(nonatomic,strong,readonly) MASViewAttribute *baseline;
NSLayoutAttributeBaseline 文本基线
//define this constant if you want to use Masonry without the 'mas_' prefix //如果你想在使⽤用Masonry时,省略"mas_"这个前缀定义下⾯面这个宏#define MAS_SHORTHAND
//define this constant if you want to enable auto- boxing for default syntax
如果想让"equalTo"默认启⽤自动装箱功能,定义下⾯面的宏#define MAS_SHORTHAND_GLOBALS
#warning mark -上⾯面的两个宏⼀一定要定义在导⼊入"MAsonry"头⽂文件的前⾯
#import"Masonry.h"
mas_equalTo有自动包装的功能,equalTo没有自动包装功能。
用mas_equalTo可以把基本数据类型转换为对象类型,这个过程叫装箱,比如自动将1包装成@1。
如果想让equalTo也带有自动装箱功能,定义宏#define MAS_shorthand_GloBALS
如果约束条件是数值或者结构体等类型,可以使用mas_equalTo进行包装。
一般将数值类型的约束用mas_equalTo,除了支持NSNumber数值类型之外 还支持CGPoint CGSize UIEdgeInsets,而相对于某个控件,或者某个控件的某个约束,使用equalTo。例句:
make.size.mas_equlaTo(CGSizeMake(100,100));
make.center.equalTo(super.view);
为UI控件添加约束,主要用到masonry里面的三个函数
Masonry_makeConstraints(添加约束)
Masonry_updateConstraints(更新约束)
Masonry_remakeConstraints(删除所有约束后,重新添加约束)
注意:使用Masonry_remakeConstraints要记得将约束写在更新约束里面,然后调用
[self setNeedsUpdateConstraints];(告知需要更新约束,但是不会立刻开始)
[Self UpdateConstraintsIfNeeded];(告知立刻更新约束)
[Self layoutIfNeeded];(告知页面布局立刻更新,一般和setNeedsLayOut一起使用,如果希望立刻生成新的frame需要调用此方法,利用这点一般布局动画可以在更新布局后直接使用这个方法让动画生效)
[UIView animateWithDuration:3 animations:^{
//更新blueVIew的约束
[blueView updateConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(200);
make.left.top.equalTo(self.view).offset(50);
}];
[self.view layoutIfNeeded];
}];
添加控件的约束的代码示例
[View mas_makeConstraints:^(MASConstraintMaker *make){
make.top.equalTo(superview.mas_top).offset(padding.top);
make.height.equalTo(superview);
make.width.equalTo(superView).multipliedBy(0.5);(使用乘数,表示约束值为约束对象superview的1/2)
//make.edges.mas_offset(UIEdgeInsetsMake(10, 10, 10, 10));相当于设置了上下左右的约束
//euqalTo等于 greaterThanOrEqualTo大于等于 lessThanOrEqualTo小于等于
}];
注意:1.用mas_makeConstraints的那个view需要先添加,就是addSubview后才能用这个方法。
2.因为iOS中原点在左上角所以需要注意使用offset时注意right和bottom用负数。
3.更新约束,当所要更新约束的控件之前已经添加过同属性的约束时在此方法中再添加同属性的约束时会把之前添加过的属性约束给覆盖掉,然后用新的约束,如果在此方法中添加新的约束属性时,可能会造成约束冲突。
4.当约束控件属性的offset值⼀一样时,约束属性可以连续设置。当约束控件的属性和参照控件的属性相同时参照控件的属性可以省略。
5.直接设置控件的内边距来约束控件,要注意mas_equalTo和equalTo的区别。
添加约束时常见的错误提示
1.Constraint items must each be an instance of UIView or
subclass //约束项都 必须是UIView的或子类的实例
2.Unabletosimultaneouslysatisfyconstraints. //不能同时满足约束。