原文鏈接
Masonry 是一個(gè)基于 AutoLayout 的輕量級(jí)布局框架市埋。
主要是對(duì)這兩個(gè)API的封裝:
- (void)addConstraint:(NSLayoutConstraint *)constraint;
- (void)removeConstraint:(NSLayoutConstraint *)constraint;
// NSLayoutConstraint 方法
+ (instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(nullable id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;
Masonry 每個(gè)類的職責(zé)劃分
核心類為
MASConstraintMaker
不傅,負(fù)責(zé)收集MASConstraint
涛酗,為MASConstraint
的install
做準(zhǔn)備;由
MASConstraintMaker
統(tǒng)一管理MASConstraint
的install
, 具體install
過程發(fā)生在MASConstraint
的- (void)install;
內(nèi);MASConstraint
中包含生成一個(gè)NSLayoutConstraint
所需要的所有信息逛球;MASViewAttribute
是MASConstraint
的組成部分, 描述了生成一個(gè)NSLayoutConstraint
需要的 一組item
和NSLayoutAttribute
信息苫昌;
將 NSLayoutConstraint
設(shè)置到 View 上
MASConstraint
的 - (void)install颤绕;
部分代碼如下幸海,
針對(duì) Masonry
的三個(gè)關(guān)鍵 API
不同的調(diào)用規(guī)則如下:
// Masonry 的三個(gè)關(guān)鍵 API
- (NSArray *)mas_makeConstraints:(void(NS_NOESCAPE ^)(MASConstraintMaker *make))block;
- (NSArray *)mas_updateConstraints:(void(NS_NOESCAPE ^)(MASConstraintMaker *make))block;
- (NSArray *)mas_remakeConstraints:(void(NS_NOESCAPE ^)(MASConstraintMaker *make))block;
MASLayoutConstraint *existingConstraint = nil;
if (self.updateExisting) { // mas_updateConstraints 調(diào)用時(shí)會(huì)走這里
existingConstraint = [self layoutConstraintSimilarTo:layoutConstraint];
}
if (existingConstraint) { // mas_updateConstraints 調(diào)用驱敲,并且existingConstraint 不為 nil 時(shí)會(huì)走這里
// just update the constant
existingConstraint.constant = layoutConstraint.constant;
self.layoutConstraint = existingConstraint;
} else { // mas_makeConstraints 和 mas_remakeConstraints 調(diào)用揍魂。 或 mas_updateConstraints 調(diào)用 且existingConstraint 為 nil時(shí)走這里
[self.installedView addConstraint:layoutConstraint];
self.layoutConstraint = layoutConstraint;
[firstLayoutItem.mas_installedConstraints addObject:self];
}
constraint的保存和移除
通過給UIView綁定一個(gè)set容器,存儲(chǔ)加在當(dāng)前view上的Contraints
备闲。
- (NSMutableSet *)mas_installedConstraints {
NSMutableSet *constraints = objc_getAssociatedObject(self, &kInstalledConstraintsKey);
if (!constraints) {
constraints = [NSMutableSet set];
objc_setAssociatedObject(self, &kInstalledConstraintsKey, constraints, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
return constraints;
}