美文网首页
masonry学习笔记

masonry学习笔记

作者: 我是小胡胡123 | 来源:发表于2017-11-20 14:24 被阅读245次

一、封装结构

MASConstraint 约束
MASCompositeConstraint 一组约束//
MASViewConstraint 一个约束//囊括整个约束计算公式的所有数据(firstViewAttribute、secondViewAttribute、常量值、关系、优先级、比例值。用于链式操作的“delegate”)。

MASConstraintMaker 创建约束的工厂
MASViewAttribute 封装 View+约束, 等式两边的计算因子(结构相当于元组类型)

View+MASAdditions 入口( 创建计算MASViewAttribute的工厂 )
ViewController+MASAdditions 入口( 创建MASViewAttribute的工厂 )

NSArray+MASAdditions 对数组中的每一个view做相同的约束操作。 批量操作。还提供了一套统一布局的方法。(固定大小,固定间距)
MASUtilities 用来将任何类型(数值类型,对象类型), 转化为对象类型

二、链式

1、

make.height.inset(10);//无效。因为layoutAttribute是NSLayoutAttributeHeight
make.height.mas_equalTo(10);

2、

make.height.mas_equalTo(10); // 如果是NSValue类型。给firstView设置
make.height.mas_equalTo(self.view);// 如果是View类型, 创建secondViewAttribute。并且属性NSLayoutAttribute与firstViewAttribute相同
make.height.mas_equalTo(self.view.mas_height); //如果是计算因子类型。则直接赋值。

3,

链式如何实现的?

MASCompositeConstraint(一组约束) 代理。
MASConstraintMaker (创建约束的工厂) 代理。

//操作1
make.top.offset(0);
make.bottom.offset(0);
make.size.sizeOffset(CGSizeZero);

//链式1
make.top.left.right.offset(0);

//链式2
make.edges.top.left.offset(0);

//链式3
make.top.equalTo(@20).equalTo(@30);

// 不支持这种链式: 后面的-10会覆盖前面的10
make.top.left.equalTo(@10).bottom.right.equalTo(@(-10));

    MASLayoutConstraint *existingConstraint = nil;
    if (self.updateExisting) {
        existingConstraint = [self layoutConstraintSimilarTo:layoutConstraint];
    }
    if (existingConstraint) {
        // just update the constant
        existingConstraint.constant = layoutConstraint.constant;
        self.layoutConstraint = existingConstraint;
    }////////

//不支持重复添加约束
//equalTo(v2.mas_left)第二个约束,重复添加。
//NSAssert(!self.hasLayoutRelation || self.layoutRelation == relation && [attribute isKindOfClass:NSValue.class], @"Redefinition of constraint relation");

make.top.left.equalTo(v2.mas_top).equalTo(v2.mas_left).equalTo(@0);

// 不支持这种链式
make.center.size.edges

masConstraint

#pragma mark - attribute chaining

- (MASConstraint *)addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute {
    NSAssert(!self.hasLayoutRelation, @"Attributes should be chained before defining the constraint relation");

    return [self.delegate constraint:self addConstraintWithLayoutAttribute:layoutAttribute];
}


masCompositeConstraint

#pragma mark - attribute chaining

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

- (MASConstraint *)constraint:(MASConstraint __unused *)constraint addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute {
    id<MASConstraintDelegate> strongDelegate = self.delegate;
    MASConstraint *newConstraint = [strongDelegate constraint:self addConstraintWithLayoutAttribute:layoutAttribute];
    newConstraint.delegate = self;
    [self.childConstraints addObject:newConstraint];
    return newConstraint;
}


- (void)constraint:(MASConstraint *)constraint shouldBeReplacedWithConstraint:(MASConstraint *)replacementConstraint {
    NSUInteger index = [self.childConstraints indexOfObject:constraint];
    NSAssert(index != NSNotFound, @"Could not find constraint %@", constraint);
    [self.childConstraints replaceObjectAtIndex:index withObject:replacementConstraint];
}

maker

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

- (MASConstraint *)addConstraintWithAttributes:(MASAttribute)attrs {
    /////
    NSMutableArray *children = [NSMutableArray arrayWithCapacity:attributes.count];
    
    for (MASViewAttribute *a in attributes) {
        [children addObject:[[MASViewConstraint alloc] initWithFirstViewAttribute:a]];
    }
    
    MASCompositeConstraint *constraint = [[MASCompositeConstraint alloc] initWithChildren:children];
    constraint.delegate = self;
    [self.constraints addObject:constraint];
    return constraint;

}


- (MASConstraint *)constraint:(MASConstraint *)constraint addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute {
    MASViewAttribute *viewAttribute = [[MASViewAttribute alloc] initWithView:self.view layoutAttribute:layoutAttribute];
    MASViewConstraint *newConstraint = [[MASViewConstraint alloc] initWithFirstViewAttribute:viewAttribute];
    if ([constraint isKindOfClass:MASViewConstraint.class]) {
        //replace with composite constraint
        NSArray *children = @[constraint, newConstraint];
        MASCompositeConstraint *compositeConstraint = [[MASCompositeConstraint alloc] initWithChildren:children];
        compositeConstraint.delegate = self;
        [self constraint:constraint shouldBeReplacedWithConstraint:compositeConstraint];
        return compositeConstraint;
    }
    if (!constraint) {
        newConstraint.delegate = self;
        [self.constraints addObject:newConstraint];
    }
    return newConstraint;
}

- (void)constraint:(MASConstraint *)constraint shouldBeReplacedWithConstraint:(MASConstraint *)replacementConstraint {
    NSUInteger index = [self.constraints indexOfObject:constraint];
    NSAssert(index != NSNotFound, @"Could not find constraint %@", constraint);
    [self.constraints replaceObjectAtIndex:index withObject:replacementConstraint];
}

4、设置布局值

尝试用不支持的值设置布局常量.attempting to set layout constant with unsupported value
NSNumber,CGPoint,CGSize,UIEdgeInsets

尝试添加不支持的属性attempting to add unsupported attribute
UIView、NSValue、MASViewAttribute

offset只是改变约束常量值
equalTo会增加约束关系(secondeViewAttribute),如果是NSValue类型(与offset效果相似),根据约束的布局属性NSLayoutAttribute是否匹配,设置对应的常量值。

//相同
make.left.equalTo(@20);
make.left.offset(20);
//相同
make.left.equalTo(v2.mas_right).offset(20);
make.left.equalTo(v2.mas_right).equalTo(@20);

make.top.inset(0).insets(UIEdgeInsetsZero).offset(0).sizeOffset(CGSizeZero).centerOffset(CGPointZero).valueOffset([NSValue valueWithCGPoint:CGPointZero]).valueOffset( [NSValue value:&CGPointZero withObjCType:@encode(typeof((CGPointZero)))]);

//NSLayoutAttributeTop,NSLayoutAttributeLeft , 会造成崩溃
Constraint improperly relates anchors of incompatible types

make.top.equalTo(v2.mas_left);//崩溃
make.top.equalTo(@[v2.mas_top,v2.mas_left]);//崩溃

如果是第一个View不是大小约束,且第二个Item是nil,则第二个Item自动设置为第一个View的父View,属性关系与第一个View的属性相同。

+(instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(nullable id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;

相关文章

  • iOS框架·Masonry源码深度解析及学习启示:设计模式与链式

    传送门:链式编程小Demo 这篇文章是 Masonry 框架源码的解析和笔记。学习Masonry之前,先了解这个框...

  • Masonry学习笔记

    Masonry Masonry是一个轻量级的布局框架,采用链式语法封装自动布局,简明,高可读。 通常leading...

  • Masonry 学习笔记

    Masonry 用链式语句封装自动化布局,让布局的语句可以更简洁明了,可读性更高。首先将布局语句封装在 block...

  • masonry学习笔记

    一、封装结构 MASConstraint 约束MASCompositeConstraint 一组约束//MASVi...

  • Masonry 学习笔记

    一个轻量级的布局框架, 同时支持 iOS 和 Mac OS X, 采用更优雅的链式语法封装自动布局,语法优雅, 帮...

  • Masonry学习笔记

    Masonry是一个轻量级的布局框架, 对AutoLayout 进行了封装,它拥有自己的描述语法(采用更优雅的链式...

  • Masonry学习笔记

    Masonry是一个轻量级的布局框架 拥有自己的描述语法 采用更优雅的链式语法封装自动布局 简洁明了 并具有高可读...

  • masonry

    为什么要做这个笔记 masonry [https://github.com/SnapKit/Masonry]可以说...

  • Masonry笔记

    - (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMa...

  • Masonry 笔记

    最近每周末都会看叶孤城的直播,对于我们iOS开发者来说,确实是一个福利,很感谢他们的分享精神,收获到的一些东西特此...

网友评论

      本文标题:masonry学习笔记

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