Masonry 基本用法及规范总结

一、常见约束的各种类型

1.尺寸:width、height、size
2.边界:left、leading、right、trailing、top、bottom
3.中心点:center、centerX、centerY
4.边界:edges
5.偏移量:offset、insets、sizeOffset、centerOffset

二、Masonry约束易忽略的技术点

防止block中的循环引用,使用弱引用(这是错误观点),在这里block是局部的引用,block内部引用self不会造成循环引用的
__weak typeof (self) weakSelf = self;(没必要的写法

三、基本方法

* mas_makeConstraints:          /*添加约束*/
* mas_updateConstraints:        /*更新约束*/
* mas_remakeConstraints:        /*删除约束*/``

注:使用上面方法的元素必须添加到父视图中

四、用法&规范

  • mas_equalTo && equalTo 前者是对后者进行了一次封装,对基本数据类型进行了兼容,用起来会更加的方便。
 /*make.top.equalTo(@64);        这里边必须得是对象,否则会引起Crash*/
  make.top.mas_equalTo(64);     可以直接使用基本数据类型,更加便捷
  • 我一般都是喜欢在控制器里导入 #import "Masonry.h"之前再添加两个宏,来提高App的开发效率。
//1. 对于约束参数可以省去"mas_"
#define MAS_SHORTHAND
//2. 对于默认的约束参数自动装箱(去掉mas前缀)
#define MAS_SHORTHAND_GLOBALS

  • equalTo() -默认的是参照是父视图,如果是相对于父视图的约束,可以进行如下简写
[iconView makeConstraints:^(MASConstraintMaker *make) {
        /*make.right.equalTo(self.view).offset(-30); 这里可以简写成下面的样子*/
        make.right.equalTo(30);  //特殊情况
        make.right.equalTo(self.leftView).offset(-30);  
 }];
  • 正常参照父视图的约数
[iconView makeConstraints:^(MASConstraintMaker *make) {
        make.right.equalTo(-30);  
        make.left.equalTo(30);  
        make.top.equalTo(30); 
        make.bottom.equalTo(-30); 
     // 由于坐标系的原因,所以右,下的坐标相对位置 是负值
 }];
  • 如果相对于父视图一致的情况
   [iconView makeConstraints:^(MASConstraintMaker *make) {
          make.edges.equalTo(0);    // 完全一致
          make.left.equalTo(0);     // 起点一致
          make.right.equalTo(0);    // 终点一致
          make.center.equalTo(0);   // 中心一致
          make.top.equalTo(0);      // 顶部一致
          make.bottom.equalTo(0);   // 底部一致
    }];
  • 相对于其他视图约数
   [iconView makeConstraints:^(MASConstraintMaker *make) {
          make.left.equalTo(self.customView).offset(30);
        // 如果self.customView 没有指定left或是right等具体位置默认是make.所指定的位置
          make.left.equalTo(self.customView.right).offset(30);
        // 从custom右侧30的距离开始
          make.right.equalTo(self.customView.left).offset(-20);
        // 距离custom.left 20 的距离
          make.center.equalTo(self.customView);  
        // 中心一致
          make.top.equalTo(self.customView.bottom).offset(20);      
        // 顶部距离customView底部20
          make.bottom.equalTo(self.customView.top);   
       // 底部与customView.top 一致
    }];
  • 动画和普通的方法实现差不多,重点只是修改约束后调用
[iconView.superview layoutIfNeeded];
[iconView mas_makeConstraints:^(MASConstraintMaker *make) {

make.top.equalTo(400);

make.left.equalTo(100);

make.size.equalTo(CGSizeMake(100, 100));

}];

[iconView.superview layoutIfNeeded];
//如果其约束还没有生成的时候需要动画的话,就请先强制刷新后才写动画,否则所有没生成的约束会直接跑动画

[UIView animateWithDuration:3 animations:^{

[iconView mas_updateConstraints:^(MASConstraintMaker *make) {

make.left.equalTo(200);

}];

[iconView.superview layoutIfNeeded];//强制绘制

}];
  • 更新约束的问题
  //1.告知需要更新约束,但不会立刻开始,系统然后调用updateConstraints
  [self setNeedsUpdateConstraints];

  //2.告知立刻更新约束,系统立即调用updateConstraints
  [self updateConstraintsIfNeeded];
  [UIView animateWithDuration:0.4 animations:^{
      [self layoutIfNeeded]; //告知页面立刻刷新,系统立即调用updateConstraints
  }];
}
//苹果官方建议:添加/更新约束在这个方法(updateConstraints)内
- (void)updateConstraints {
   //更新约束
    [iconView updateConstraints:^(MASConstraintMaker *make) {
        make.center.equalTo(0);
        make.width.equalTo(200);
        make.height.equalTo(300);
    }];
    //最后必须调用父类的更新约束
    [super updateConstraints];
}

*Scrollview适配

//scrollView添加一个主要子视图,大小贴合
UIView *bgView = [[UIView alloc] init];
bgView.backgroundColor = [UIColor blueColor];
[_scrollview addSubview:bgView];
[bgView mas_makeConstraints:^(MASConstraintMaker *make) {
     make.top.left.bottom.and.right.equalTo(0);
     make.width.equalTo(_scrollview);
}];

//此后所有子视图都需添加在此bgView上

UIView *childV = [[UIView alloc] init];
childV.backgroundColor = [UIColor cyanColor];
[bgView addSubview:childV];
[childV mas_makeConstraints:^(MASConstraintMaker *make) {
     make.left.right.equalTo(0);
     make.top.equalTo(250);
     make.height.equalTo(1000);
}];

//以最后所加子视图为准,再对bgView进行重新约束
[bgView mas_updateConstraints:^(MASConstraintMaker *make) {
      make.bottom.equalTo(childV.bottom);
}];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容