源码阅读:Masonry(六)——MASViewConstraint
该⽂章阅读的 Masonry 的版本为 1.1.0。
这个类继承⾃ MASConstraint 类,是 MASCompositeConstraint 类的兄弟类,并且对 NSLayoutConstraint 类进⾏了封装。
1.公共属性
@property (nonatomic, strong, readonly) MASViewAttribute *firstViewAttribute;
复制代码
这个属性是⽬标约束视图及其属性类对象,也就是 view1 + attr1。
@property (nonatomic, strong, readonly) MASViewAttribute *condViewAttribute;
复制代码
这个属性是参考约束视图及其属性类对象,也就是 view2 + attr2。
2.公共⽅法
- (id)initWithFirstViewAttribute:(MASViewAttribute *)firstViewAttribute;
复制代码
以指定⽬标约束视图及其属性类对象初始化该类对象。
+ (NSArray *)installedConstraintsForView:(MAS_VIEW *)view;
复制代码
返回指定视图作为 view1 上所有安装的约束,
3.私有分类 UIView+MASConstraints
在 .m ⽂件中,作者写了⼀个私有的 UIView 的分类,通过关联对象给这个分类添加了⼀个属性 mas_installedConstraints,⽤于保存安装到视图上的视图约束封装对象。
@interface MAS_VIEW (MASConstraints)
@property (nonatomic, readonly) NSMutableSet *mas_installedConstraints;
@end
@implementation MAS_VIEW (MASConstraints)
static char kInstalledConstraintsKey;
- (NSMutableSet *)mas_installedConstraints {
NSMutableSet *constraints = objc_getAssociatedObject(lf, &kInstalledConstraintsKey);
if (!constraints) {
constraints = [NSMutableSet t];
objc_tAssociatedObject(lf, &kInstalledConstraintsKey, constraints, OBJC_ASSOCIATION_RETAIN_NONATOMIC); }
return constraints;
}
@end
复制代码
4.类扩展
/**
保存参考约束视图及其属性类对象,也就是 view2 + attr2。
*/
@property (nonatomic, strong, readwrite) MASViewAttribute *condViewAttribute;
复制代码
/**
保存安装约束的接收视图。
*/
@property (nonatomic, weak) MAS_VIEW *installedView;
复制代码
/
**
dnf刷图职业保存约束对象。
*/
@property (nonatomic, weak) MASLayoutConstraint *layoutConstraint;
复制代码
/**
保存约束关系,也就是 relation。
*/
@property (nonatomic, assign) NSLayoutRelation layoutRelation;
复制代码呼和浩特美食
/**
保存约束优先级。
*/
@property (nonatomic, assign) MASLayoutPriority layoutPriority;
复制代码
/**
保存约束乘数,也就是 multiplier。
*/
@property (nonatomic, assign) CGFloat layoutMultiplier;
复制代码
/**
保存约束常数,也就是 c。
*/
@property (nonatomic, assign) CGFloat layoutConstant;
石溜复制代码
/**
保存是否已经设置过约束关系。
*/
@property (nonatomic, assign) BOOL hasLayoutRelation;
复制代码
/**
保存约束对象标识
*/
@property (nonatomic, strong) id mas_key;
复制代码
/**
保存安装约束时是否使⽤动画
*/
@property (nonatomic, assign) BOOL uAnimator;
复制代码
5.实现
5.1 公共⽅法
- (id)initWithFirstViewAttribute:(MASViewAttribute *)firstViewAttribute { lf = [super init];
if (!lf) return nil;
/
/ 保存参数
_firstViewAttribute = firstViewAttribute;
// 设置属性
lf.layoutPriority = MASLayoutPriorityRequired;
lf.layoutMultiplier = 1;
return lf;
}
复制代码
+ (NSArray *)installedConstraintsForView:(MAS_VIEW *)view {
// 获取保存的所有元素
return [view.mas_installedConstraints allObjects];
}
复制代码
- (void)tSecondViewAttribute:(id)condViewAttribute {
if ([condViewAttribute isKindOfClass:NSValue.class]) {
// 如果传⼊的约束属性是 NSValue 类型的,就调⽤⽗类 MASConstraint 中的⽅法处理
[lf tLayoutConstantWithValue:condViewAttribute];
} el if ([condViewAttribute isKindOfClass:MAS_VIEW.class]) {
// 如果传⼊的约束属性是 UIView 类型的,就以传⼊的视图和 attr1 实例化⼀个约束视图及其属性类并保存
_condViewAttribute = [[MASViewAttribute alloc] initWithView:condViewAttribute layoutAttribute:lf.firstViewAttribute.layoutAttribute]; } el if ([condViewAttribute isKindOfClass:MASViewAttribute.class]) {
/
/ 如果传⼊的约束属性是 MASViewAttribute 类型的,就直接保存。
_condViewAttribute = condViewAttribute;
} el {
// 传⼊的参数,只能是上⾯三种情况之⼀
NSAsrt(NO, @"attempting to add unsupported attribute: %@", condViewAttribute);
}
傣族的节日}
复制代码
5.2 私有⽅法
/**
重写了类扩展中添加的属性 layoutConstant 的 tter
电话打不出去是怎么回事
*/
- (void)tLayoutConstant:(CGFloat)layoutConstant {
// 保存参数
_layoutConstant = layoutConstant;
#if TARGET_OS_MAC && !(TARGET_OS_IPHONE || TARGET_OS_TV)
// 兼容其他系统
if (lf.uAnimator) {
[lf.layoutConstraint.animator tConstant:layoutConstant];
} el {
stant = layoutConstant;
}
#el
// 直接将参数赋值给约束对象的 constant 属性
stant = layoutConstant;
#endif
}
复制代码
/**
重写了类扩展中添加的属性 layoutRelation 的 tter
*/
- (void)tLayoutRelation:(NSLayoutRelation)layoutRelation {
// 保存参数
_layoutRelation = layoutRelation;
// 保存状态
lf.hasLayoutRelation = YES;
}
复制代码
/**
判断当前系统版本是否⽀持 isActive 属性,iOS8 之后的版本⽀持这个属性,⽤于版本兼容
*/
- (BOOL)supportsActiveProperty {
return [lf.layoutConstraint respondsToSelector:@lector(isActive)];
}
复制代码
/**
判断约束对象是否处于活动状态
*/
- (BOOL)isActive {
BOOL active = YES;
// 判断是否⽀持这个属性
if ([lf supportsActiveProperty]) {
// 获取该属性的值
狐狸眼男生active = [lf.layoutConstraint isActive];
}
return active;
}
复制代码
/**
判断约束对象是否已安装
*/
- (BOOL)hasBeenInstalled {让我靠近
// 必须有约束对象,并且约束对象处于活动状态,才是已安装
return (lf.layoutConstraint != nil) && [lf isActive];
工资支付}
复制代码
/
**
获取与指定约束对象相似的约束对象
*/
- (MASLayoutConstraint *)layoutConstraintSimilarTo:(MASLayoutConstraint *)layoutConstraint {
// 遍历要设置约束视图的所有已设置的约束
// 除了约束对象的常数 c 之外,其他属性必须都相同,才是相似的约束对象
for (NSLayoutConstraint *existingConstraint in verObjectEnumerator) { if (![existingConstraint isKindOfClass:MASLayoutConstraint.class]) continue;
if (existingConstraint.firstItem != layoutConstraint.firstItem) continue;
if (dItem != dItem) continue;
if (existingConstraint.firstAttribute != layoutConstraint.firstAttribute) continue;
if (dAttribute != dAttribute) continue;
if (lation != lation) continue;
if (existingConstraint.multiplier != layoutConstraint.multiplier) continue;
if (existingConstraint.priority != layoutConstraint.priority) continue;
return (id)existingConstraint;
}
return nil;
}
复制代码
5.3 ⽗类⽅法