Use constants for Masonry learning


Code using constants is simpler:

- (id)init {
    self = [super init];
    if (!self) return nil;

    UIView *purpleView =;
    purpleView.backgroundColor = UIColor.purpleColor;
    purpleView.layer.borderColor = UIColor.blackColor.CGColor;
    purpleView.layer.borderWidth = 2;
    [self addSubview:purpleView];

    UIView *orangeView =;
    orangeView.backgroundColor = UIColor.orangeColor;
    orangeView.layer.borderColor = UIColor.blackColor.CGColor;
    orangeView.layer.borderWidth = 2;
    [self addSubview:orangeView];

    //example of using constants

    [purpleView mas_makeConstraints:^(MASConstraintMaker *make) {;

    // auto-boxing macros allow you to simply use scalars and structs, they will be wrapped automatically

    [orangeView mas_makeConstraints:^(MASConstraintMaker *make) {, 50));
        make.size.equalTo(CGSizeMake(200, 100));

    return self;

Run result:

In this case, I think that when the distance between the child view and the edge of the parent view is fixed, this can be done to further simplify the code, such as:;

Write completely should be:;

One detail to note is that the constant is preceded by an @ character.So no more?I remove the @ directly. I don't see any difference in the results, but it is obviously different. Follow up to see:

#define equalTo(...)                     mas_equalTo(__VA_ARGS__)
#define mas_equalTo(...)                 equalTo(MASBoxValue((__VA_ARGS__)))
#define MASBoxValue(value) _MASBoxValue(@encode(__typeof__((value))), (value))

Finally come to this function:

static inline id _MASBoxValue(const char *type, ...);

This function wraps a constant, converts it to a NSNumber or NSValue object, and that's all.

Posted by seeker2921 on Wed, 15 Jul 2020 09:21:28 -0700