博客> Masonry And SnapKit
Masonry And SnapKit
2017-10-15 09:49 评论:0 阅读:268 西单_夜未央
自动布局 Masonry SnapKit AutoLayout 纯代码

今天在网上瞎逛,无意翻到一些博客对xib布局是多么多么不满,其实在本人开发过程,也深有体会,无论xib还是故事版,真心累:以下有几点: 1、速度慢。这点不要否认,不管你现在硬件多牛b,慢就是慢,就比如java跟c,再怎么牛b java速度就是慢 2、一个配置不好的mac 电脑,比如mac mini 机械硬盘的那种,你知道我点开一个xib文件要看几秒的菊花?1s? 2s? 不好意思,我有过10s的经验。这是尼玛多么蛋疼的事情, 本来一个程序员最讨厌的事情就是在愉快的写代码的时候突然被打断,每当等这个句话,我砸键盘的心都有了 3、你知道同一个app如果用xib 和纯代码 打出的包大小能差多少嘛?几十k? 几百k? 对不起,我的一个项目,粗略估计,能相差3m~4m 4、你觉得xib比纯代码布局速度快??真的快?你知道现在我很多控件都复用 活着直接复制粘贴吗? 知道ctr+c ctr+v速度要快多少嘛?配合一个好用的autolayout库,纯代码并不慢!(这里介绍Masonry) 唯一慢的原因就是你对控件根本运用不熟悉,没有其他原因 5、现在版本控制工具用的无非两种 svn/git 我想大多数人都有过鼠标点了下xib 结果就出现个大大的M 对吧?想提交代码,又不敢,怀疑自己玩一手抖了把里面控件不小心挪动了位置呢?所以你还要恢复 你知道这是件多么无聊和蛋疼的事情么?我特么就点了一下啊 啊啊啊啊啊啊啊啊,好了 说到这我快炸了。。。。。。。。。。 6、 你看你的项目代码,.h .m 多么和谐,突然窜出个xib 看着都恶心,让左侧项目目录臃肿不说, 弄不好还搞错队赢关系 7、现在大多项目都用自动布局了吧?我想看一个控件的布局 我通过xib来看,我特么还要点,我特么还要找,我何不直接去代码一眼我就知道具体数值快??

开始介绍这个非常牛逼的框架Masonry(由于SnapKit跟Masonry就像孪生姐妹,用法一致,就不重复介绍)

第一步当然是导入,这里介绍高版本的cocoPod导入方法 platform :ios, '8.0' target "Auto Layout" do pod 'Masonry' end

第二步

import

第三步就是使用

//这一步很重要,避免block循环引用

__block typeof(self) weakSelf = self;

UIView *blackView = [UIView new]; blackView.backgroundColor = [UIColor blackColor]; [self.view addSubview:blackView];

//因为纯代码,需要关闭 blackView.translatesAutoresizingMaskIntoConstraints = NO

// 给黑色view添加约束

[blackView mas_makeConstraints:^(MASConstraintMaker *make) { // 添加左、上边距约束 make.left.and.top.mas_equalTo(20); // 添加右边距约束 make.right.mas_equalTo(-20); make.height.mas_equalTo(weakSelf.view.bounds.size.height/2); make.top.left.mas_equalTo(20); }];

UIView *grayView = [UIView new]; grayView.backgroundColor = [UIColor lightGrayColor]; [self.view addSubview:grayView];

// 给灰色view添加约束

[grayView mas_makeConstraints:^(MASConstraintMaker *make) { // 添加上边距约束(上边距 = 黑色view的下边框 + 偏移量20) make.top.equalTo(blackView.mas_bottom).offset(20); // 添加左边距(左边距 = 父容器纵轴中心 + 偏移量0) make.size.left.equalTo(blackView); }];

就这么简单,两个平分屏幕高度,边距20的view就出现了

  // 更新约束

- (void)updateConstraints { [self.growingButton mas_updateConstraints:^(MASConstraintMaker *make) { make.center.equalTo(self); //priorityLow 优先级(低) make.width.equalTo(@(self.buttonSize.width)).priorityLow(); make.height.equalTo(@(self.buttonSize.height)).priorityLow(); make.width.lessThanOrEqualTo(self); make.height.lessThanOrEqualTo(self); }];

//according to apple super should be called at end of method [super updateConstraints]; }

//  取消约束
  • (void)changeButtonPosition { [self.button mas_remakeConstraints:^(MASConstraintMaker *make) { make.size.equalTo(self.buttonSize);

    if (topLeft) {
        make.top.and.left.offset(10);
    } else {
        make.bottom.and.right.offset(-10);
    }

    }]; }

    // 什么时候加约束

@implementation DIYCustomView

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

    // --- Create your views here --- self.button = [[UIButton alloc] init];

    return self; }

// tell UIKit that you are using AutoLayout

  • (BOOL)requiresConstraintBasedLayout { return YES; }

// this is Apple's recommended place for adding/updating constraints

  • (void)updateConstraints {

    // --- remake/update constraints here [self.button remakeConstraints:^(MASConstraintMaker *make) { make.width.equalTo(@(self.buttonSize.width)); make.height.equalTo(@(self.buttonSize.height)); }];

    //according to apple super should be called at end of method [super updateConstraints]; }

  • (void)didTapButton:(UIButton *)button { // --- Do your changes ie change variables that affect your layout etc --- self.buttonSize = CGSize(200, 200);

    // tell constraints they need updating [self setNeedsUpdateConstraints]; }

@end

 // 总结

可以给控件添加left/right/top/bottom/size/height/width/insert约束; 库提供了三个方法,mas_makeConstraints添加约束,mas_updateConstraints修改约束,mas_remakeConstraints清除以前约束并添加新约束; 可以通过view.mas_bottom获得view的某个约束; 在约束的block中,使用make来给当前控件添加约束。

收藏
0
sina weixin mail 回到顶部