Masonry

作者: sjtupt | 来源:发表于2018-03-11 19:54 被阅读8次

    基本原理

    • 基于iOS系统的Autolayout,是对系统autolayout的封装。

    • 根据item1.attribute1 = multiplier * item2.attribute1 + offset 构建一个 NSLayoutConstraint

    • NSLayoutConstraint添加到视图中。有些需要加入到视图自身上,有些需要加入到两个视图的最近父节点上面。找最近父节点,这其实是一个经典的算法题,可以有各种花哨的算法,而Masnory是通过双层循环,主要视图的层次结构不会嵌套很深,所以这样也不会太影响性能。

    源码解析

    • 通过view category, 提供了设置布局的三个方法:
      • - (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *make))block;

      • - (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *make))block;

      • - (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block;

    以及@property (nonatomic, strong, readonly) MASViewAttribute *mas_left;等布局属性。

    mas_makeConstraints实现:
    - (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {
        self.translatesAutoresizingMaskIntoConstraints = NO;
        MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
        block(constraintMaker);
        return [constraintMaker install];
    }
    

    方法内部会先创建一个MASConstraintMakermaker,并将此maker传入block执行,生成一堆layoutConstraints,最后在将layoutConstraints添加到对应的视图中。

    mas_updateConstraintsmas_remakeConstraintsmas_makeConstraints类似,只是分别会设置makerupdateExistingremoveExisting属性。有啥用???

    mas_left等布局属性:
    - (MASViewAttribute *)mas_left {
        return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeft];
    }
    

    生成一个对应MASViewAttribute 对象。MASViewAttribute这个类其实就是view和属性的一个包装而已。

    • MASConstraintMaker分析:
      提供了@property (nonatomic, strong, readonly) MASConstraint *left;等单个layoutConstraint@property (nonatomic, strong, readonly) MASConstraint *size;等复合布局约束、- (MASConstraint * (^)(dispatch_block_t))group;及上文中提及的install方法、updateExisting属性、removeExisting属性。

    left属性

    - (MASConstraint *)left {
        return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeft];
    }
    

    调用

    - (MASConstraint *)addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute {
        return [self constraint:nil addConstraintWithLayoutAttribute:layoutAttribute];
    }
    

    size属性

    - (MASConstraint *)addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute {
        return [self constraint:nil addConstraintWithLayoutAttribute:layoutAttribute];
    }
    

    相关文章

      网友评论

          本文标题:Masonry

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