美文网首页iOS&Mac
Masonry源码解析

Masonry源码解析

作者: ADreamClusive | 来源:发表于2020-07-13 18:28 被阅读0次

原文链接
Masonry 是一个基于 AutoLayout 的轻量级布局框架。

主要是对这两个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 每个类的职责划分

  • 核心类为 MASConstraintMaker ,负责收集 MASConstraint ,为 MASConstraintinstall 做准备;

  • MASConstraintMaker 统一管理 MASConstraintinstall, 具体 install 过程发生在 MASConstraint- (void)install; 内;

  • MASConstraint 中包含生成一个 NSLayoutConstraint 所需要的所有信息;

  • MASViewAttributeMASConstraint 的组成部分, 描述了生成一个 NSLayoutConstraint 需要的 一组 itemNSLayoutAttribute 信息;

NSLayoutConstraint 设置到 View 上

MASConstraint- (void)install; 部分代码如下,
针对 Masonry 的三个关键 API 不同的调用规则如下:

//  Masonry 的三个关键 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 调用时会走这里
    existingConstraint = [self layoutConstraintSimilarTo:layoutConstraint];
}
if (existingConstraint) { // mas_updateConstraints 调用,并且existingConstraint 不为 nil 时会走这里
    // just update the constant
    existingConstraint.constant = layoutConstraint.constant;
    self.layoutConstraint = existingConstraint;
} else { //  mas_makeConstraints 和 mas_remakeConstraints 调用。 或 mas_updateConstraints 调用 且existingConstraint 为 nil时走这里
    [self.installedView addConstraint:layoutConstraint];
    self.layoutConstraint = layoutConstraint;
    [firstLayoutItem.mas_installedConstraints addObject:self];
}

constraint的保存和移除

通过给UIView绑定一个set容器,存储加在当前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;
}

相关文章

  • Masonry

    iOS开发之Masonry框架源码解析

  • iOS有名第三方库源码解析(收集集合)

    收集一些源码解析,供日后研读:1.iOS开发之Masonry框架源码解析 2.MJRefresh 源码解析 3.Y...

  • Masonry 源码解析

    Masonry 源码解析 上图是 Masonry 的大体结构。 Masonry 主要分两层,一部分通过主要的用户接...

  • App架构方方面面

    布局 揭秘 iOS 布局 Masonry源码解析 自动布局&绝对布局autolayoutautolayout 动画...

  • Masonry源码解析

    Masonry一直是OC中优秀的Auto Layout框架,尤其是其优雅的点链式语法设计,为人津津乐道。 今天我们...

  • Masonry 源码解析

    Masonry 是一个轻量级的用于自动布局(AutoLayout)的第三方框架,以其简洁的使用方式,受到广大开发者...

  • Masonry源码解析

    原文链接Masonry 是一个基于 AutoLayout 的轻量级布局框架。 主要是对这两个API的封装: Mas...

  • Masonry源码解析

    原文链接Masonry 是一个基于 AutoLayout 的轻量级布局框架。 主要是对这两个API的封装: Mas...

  • Masonry源码解析

    Masonry 的实现其实特别简洁,只有 2800 多行代码,10个类文件,以下是核心类的导图,以及核心流程解析:...

  • Masonry源码解析

    Masonry简介 Masonry是用于自动布局的第三方框架,对苹果的自动布局框架进行了一层封装,其接口比起官方的...

网友评论

    本文标题:Masonry源码解析

    本文链接:https://www.haomeiwen.com/subject/todzcktx.html