1. Autolayout所倡导的两个核心词是约束,参照
2. 而我认为,Autolayout其实核心思想还是为了设置frame
3. 无论我们如何添加约束,最终还是为了确定其位置与尺寸
4. 所以,Autolayout的关键就是如何设置约束,让空间满足位置,尺寸这两个必要条件
5. 还有就是,当一个控件的约束已经能够满足上述两个条件了,就不要再添加多余的约束了,很容易会照成约束冲突
一、setNeedsLayout
1. setNeedsLayout:告知页面需要更新,但是不会立刻开始更新。执行后会立刻调用layoutSubviews。layoutIfNeeded:告知页面布局立刻更新。所以一般都会和setNeedsLayout一起使用。如果希望立刻生成新的frame需要调用此方法,利用这点一般布局动画可以在更新布局后直接使用这个方法让动画生效。layoutSubviews:系统重写布局setNeedsUpdateConstraints:告知需要更新约束,但是不会立刻开始updateConstraintsIfNeeded:告知立刻更新约束updateConstraints:系统更新约束
二、约束的优先级
.priority允许你指定一个精确的优先级,数值越大优先级越高.最高1000..
priorityHigh等价于 UILayoutPriorityDefaultHigh .优先级值为 750..
priorityMedium介于高优先级和低优先级之间,优先级值在 250~750之间..
priorityLow等价于 UILayoutPriorityDefaultLow , 优先级值为 250.
优先级可以在约束的尾部添加:
make.left.greaterThanOrEqualTo(label.mas_left).with.priorityLow();make.top.equalTo(label.mas_top).with.priority(600);
Greater/Less 一般与 Priority 一起使用,为一个 Constraint 设置了 Greater/Less 后,调整 Priority。如果 Constraint 的 Priority 的值越大,程序优先设置它的 Constraint 效果。
三、一个数组,里面可以混合是前述三种类型的任意几种:
// 表达三个视图等高的约束.
make.height.equalTo(@[view1.mas_height, view2.mas_height]);
make.height.equalTo(@[view1, view2]);
make.left.equalTo(@[view1, @100, view3.right]);
四、masonry添加约束的方法
(1) 这个方法只会添加新的约束[view makeConstraints:^(MASConstraintMaker *make) { }]
(2) 这个方法会将以前的所有约束删掉,添加新的约束 [view remakeConstraints:^(MASConstraintMaker *make) { }];
(3)这个方法将会覆盖以前的某些特定的约束 [view updateConstraints:^(MASConstraintMaker *make) { }];
五、masonry使用注意
注意点1: 使用 mas_makeConstraints方法的元素必须事先添加到父元素的中,例如[self.view addSubview:view];
注意点2: masequalTo 和 equalTo 区别:masequalTo 比equalTo多了类型转换操作,一般来说,大多数时候两个方法都是 通用的,但是对于数值元素使用mas_equalTo。对于对象或是多个属性的处理,使用equalTo。特别是多个属性时,必须使用equalTo,例如 make.left.and.right.equalTo(self.view);
(1) 只要添加了这个宏,就不用带mas_前缀 #define MAS_SHORTHAND
(2)只要添加了这个宏,equalTo就等价于mas_equalTo
(3)这个头文件一定要放在上面两个宏的后面 #import "Masonry.h"
注意点3: 注意到方法with和and,这连个方法其实没有做任何操作,方法只是返回对象本身,这这个方法的左右完全是为了方法写的时候的可读性 。make.left.and.right.equalTo(self.view);和make.left.right.equalTo(self.view);是完全一样的,但是明显的加了and方法的语句可读性 更好点。
注意点4:multipliedBy的使用只能是设置同一个控件的,比如这里的bottomInnerView,make.height.mas_equalTo(bottomInnerView.mas_width).multipliedBy(3);
注意点5:
[iconView makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.view).with.offset(30);
make.left.equalTo(self.view).with.offset(30);
make.bottom.equalTo(self.view).with.offset(-30);
make.right.equalTo(self.view).with.offset(-30);
}];
可以简化为:
(1)make.top.left.bottom.and.right.equalTo(self.view).with.insets(UIEdgeInsetsMake(10, 10, 10, 10));
(2)make.edges.equalTo(self.view).insets(UIEdgeInsetsMake(30, 30, 30, 30));
注意点6:
其中leading与left trailing与right 在正常情况下是等价的 但是当一些布局是从右至左时(比如阿拉伯文?没有类似的经验) 则会对调 换句话说就是基本可以不理不用 用left和right就好了。用leading/trailing 后就不要用left/right,如果混用会出现崩溃
注意点7:对label约束必须设置最大约束的宽度
self.titleLabel.preferredMaxLayoutWidth = w - 100 - 15;
五、Masonry约束易忽略的技术点
使用Masonry不需要设置控件的translatesAutoresizingMaskIntoConstraints属性为NO;防止block中的循环引用,使用弱引用(这是错误观点),在这里block是局部的引用,block内部引用self不会造成循环引用的__weak typeof (self) weakSelf = self;(没必要的写法)
六、Masonry约束控件出现冲突的问题
当约束冲突发生的时候,我们可以设置view的key来定位是哪个viewredView.mas_key = @"redView";greenView.mas_key = @"greenView";blueView.mas_key = @"blueView";若是觉得这样一个个设置比较繁琐,怎么办呢,Masonry则提供了批量设置的宏MASAttachKeysMASAttachKeys(redView,greenView,blueView); //一句代码即可全部设置
http://www.cnblogs.com/ludashi/archive/2016/07/11/5591572.html