美文网首页
Masonry研究2 MASViewAttribute

Masonry研究2 MASViewAttribute

作者: 独孤流 | 来源:发表于2017-05-23 14:36 被阅读362次

    MASViewAttribute


    MASViewAttribute是用来保存某一个单个的约束属性的类
    包含的属性有:

    • view:关联的View
    • item:关联的item
    • layoutAttribute:约束内容
      layoutAttribute的类型为苹果的NSLayoutAttribute
    typedef NS_ENUM(NSInteger, NSLayoutAttribute) {
        NSLayoutAttributeLeft = 1,
        NSLayoutAttributeRight,
        NSLayoutAttributeTop,
        NSLayoutAttributeBottom,
        NSLayoutAttributeLeading,
        NSLayoutAttributeTrailing,
        NSLayoutAttributeWidth,
        NSLayoutAttributeHeight,
        NSLayoutAttributeCenterX,
        NSLayoutAttributeCenterY,
        NSLayoutAttributeLastBaseline,
        NSLayoutAttributeBaseline NS_SWIFT_UNAVAILABLE("Use 'lastBaseline' instead") = NSLayoutAttributeLastBaseline,
        NSLayoutAttributeFirstBaseline NS_ENUM_AVAILABLE_IOS(8_0),
        NSLayoutAttributeLeftMargin NS_ENUM_AVAILABLE_IOS(8_0),
        NSLayoutAttributeRightMargin NS_ENUM_AVAILABLE_IOS(8_0),
        NSLayoutAttributeTopMargin NS_ENUM_AVAILABLE_IOS(8_0),
        NSLayoutAttributeBottomMargin NS_ENUM_AVAILABLE_IOS(8_0),
        NSLayoutAttributeLeadingMargin NS_ENUM_AVAILABLE_IOS(8_0),
        NSLayoutAttributeTrailingMargin NS_ENUM_AVAILABLE_IOS(8_0),
        NSLayoutAttributeCenterXWithinMargins NS_ENUM_AVAILABLE_IOS(8_0),
        NSLayoutAttributeCenterYWithinMargins NS_ENUM_AVAILABLE_IOS(8_0),
        NSLayoutAttributeNotAnAttribute = 0
    };
    

    还有两个便捷创建方式

    - (id)initWithView:(MAS_VIEW *)view layoutAttribute:(NSLayoutAttribute)layoutAttribute {
        self = [self initWithView:view item:view layoutAttribute:layoutAttribute];
        return self;
    }
    
    /**
     *  The designated initializer.
     */
    - (id)initWithView:(MAS_VIEW *)view item:(id)item layoutAttribute:(NSLayoutAttribute)layoutAttribute {
        self = [super init];
        if (!self) return nil;
        
        _view = view;
        _item = item;
        _layoutAttribute = layoutAttribute;
        
        return self;
    }
    
    

    因为保存的主要属性的nslayoutattburite,所以重写了isEqual的方法,主要判断持有的view及属性是否一致,
    以及增加当属性为width或height时判断为SizeAttburite的方法

    - (BOOL)isSizeAttribute {
        return self.layoutAttribute == NSLayoutAttributeWidth
            || self.layoutAttribute == NSLayoutAttributeHeight;
    }
    
    - (BOOL)isEqual:(MASViewAttribute *)viewAttribute {
        if ([viewAttribute isKindOfClass:self.class]) {
            return self.view == viewAttribute.view
                && self.layoutAttribute == viewAttribute.layoutAttribute;
        }
        return [super isEqual:viewAttribute];
    }
    

    还有一个重要方法就是hash,主要用到的是一个宏,使用到的计算符有:<< 左移(右侧添加指定个0,等于乘以n个2),>>右移(除以n个2),| 或(有1就为1),^异或(同为0,不同为1)

    #define MAS_NSUINT_BIT (CHAR_BIT * sizeof(NSUInteger))
    #define MAS_NSUINTROTATE(val, howmuch) ((((NSUInteger)val) << howmuch) | (((NSUInteger)val) >> (MAS_NSUINT_BIT - howmuch)))
    - (NSUInteger)hash {
        return MAS_NSUINTROTATE([self.view hash], MAS_NSUINT_BIT / 2) ^ self.layoutAttribute;
    }
    

    相关文章

      网友评论

          本文标题:Masonry研究2 MASViewAttribute

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