Masonry框架详细解析(六) —— MASViewConstraint类解析(一)

版本记录

版本号 时间
V1.0 2018.07.20

前言

我们做APP界面,也就是布局UI,那么关于布局,我们有很多方法,苹果也都提供了支持,市场上我们用的并不是系统提供原生的layout,对于OC语言一般都是使用一个第三方的布局框架 —— Masonry。接下来几篇我们就一起深入看一下这个框架。感兴趣的看上面几篇文章。
1. Masonry框架详细解析(一) —— 基本概览(一)
2. Masonry框架详细解析(二) —— 基本结构API和约束入口(一)
3. Masonry框架详细解析(三) —— MASConstraintMaker工厂类(一)
4. Masonry框架详细解析(四) —— MASConstraint类解析(一)
5. Masonry框架详细解析(五) —— MASCompositeConstraint类解析(一)

API

该类是一个单约束,包含创建NSLayoutConstraint所需要的属性,并将其添加到适合的view上,首先看一下API

/**
 *  A single constraint.
 *  Contains the attributes neccessary for creating a NSLayoutConstraint and adding it to the appropriate view
 */
@interface MASViewConstraint : MASConstraint 

/**
 *  First item/view and first attribute of the NSLayoutConstraint
 */
//NSLayoutConstraint的第一个item/view和第一个属性
@property (nonatomic, strong, readonly) MASViewAttribute *firstViewAttribute;

/**
 *  Second item/view and second attribute of the NSLayoutConstraint
 */
//NSLayoutConstraint的第二个item/view和第二个属性
@property (nonatomic, strong, readonly) MASViewAttribute *secondViewAttribute;

/**
 *  initialises the MASViewConstraint with the first part of the equation
 *
 *  @param  firstViewAttribute  view.mas_left, view.mas_width etc.
 *
 *  @return a new view constraint
 */
//利用等式的第一部分初始化MASViewConstraint
//参数 firstViewAttribute:view.mas_left, view.mas_width等
- (id)initWithFirstViewAttribute:(MASViewAttribute *)firstViewAttribute;

/**
 *  Returns all MASViewConstraints installed with this view as a first item.
 *
 *  @param  view  A view to retrieve constraints for.
 *
 *  @return An array of MASViewConstraints.
 */
//返回该view作为第一个item安装的所有的MASViewConstraints约束
//参数:view,一个用于检索约束的视图
+ (NSArray *)installedConstraintsForView:(MAS_VIEW *)view;

@end

下面就简单的看一下这几个方法和属性

1. 实例化方法

实例化方法指的是下面这个方法

- (id)initWithFirstViewAttribute:(MASViewAttribute *)firstViewAttribute;

下面看一下实现

@property (nonatomic, assign) MASLayoutPriority layoutPriority;
@property (nonatomic, assign) CGFloat layoutMultiplier;

- (id)initWithFirstViewAttribute:(MASViewAttribute *)firstViewAttribute {
    self = [super init];
    if (!self) return nil;
    
    _firstViewAttribute = firstViewAttribute;
    self.layoutPriority = MASLayoutPriorityRequired;
    self.layoutMultiplier = 1;
    
    return self;
}

2. 返回所有安装的约束

+ (NSArray *)installedConstraintsForView:(MAS_VIEW *)view;
+ (NSArray *)installedConstraintsForView:(MAS_VIEW *)view {
    return [view.mas_installedConstraints allObjects];
}

这里要用到一个MAS_VIEW(其实就是UIView)的一个分类。

@interface MAS_VIEW (MASConstraints)

@property (nonatomic, readonly) NSMutableSet *mas_installedConstraints;

@end

@implementation MAS_VIEW (MASConstraints)

static char kInstalledConstraintsKey;

- (NSMutableSet *)mas_installedConstraints {
    //运行时获取当前view的所有安装的约束
    NSMutableSet *constraints = objc_getAssociatedObject(self, &kInstalledConstraintsKey);
    if (!constraints) {
        constraints = [NSMutableSet set];
        objc_setAssociatedObject(self, &kInstalledConstraintsKey, constraints, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    return constraints;
}

@end

MASCompositeConstraint类一样,在.m文件里面MASViewConstraint也重写了很多的父类的方法。结构很清晰。


结构

下面看一下该类的结构

Masonry框架详细解析(六) —— MASViewConstraint类解析(一)_第1张图片

大家可以看见:

  • 在.h中只暴露出来一个实例化方法和返回所有已安装约束的方法。
  • 在.m中重写了很多父类的方法,这个在讲述MASCompositeConstraint时候说过,是类似的。

后记

本篇主要讲述了MASViewConstraint类解析,感兴趣的给个赞或者关注~~~~

Masonry框架详细解析(六) —— MASViewConstraint类解析(一)_第2张图片

你可能感兴趣的:(Masonry框架详细解析(六) —— MASViewConstraint类解析(一))