Crazyydevil的博客 记录代码人生

masonry介绍与使用

2016-08-29
iOS

masonry介绍与使用

关于xib、Storyboard、手写代码的选择

业内对这个讨论的文章很多,基本也达成共识。 可以看一下唐巧博客里的这篇文章

直接说结论

对于相对静态的页面,需求变更少,个人或者小团队,开发速度要求更快的,建议多使用xib和storyboard。

对于复杂页面,需求变更多,团队协作,代码结构要求更高的,建议多使用手写代码

masonry-autolayout框架

masonry介绍

苹果在ios6之前,iphone使用320*480的点位进行开发,ipad则使用1027*768,不需要考虑适配问题,那时候大家都直接使用frame 绝对坐标。

但是在ios6出来之后,苹果出现了不同屏幕尺寸,iOS开发者面临着为不同尺寸设备开发的问题。当然苹果也提供了autolayout的方案,autolayout对xib和storyboard更友好,可以使用拖拽进行适配,但是xib和storyboard也有缺点,对于那些喜欢用代码来进行界面编写的开发者,也可以使用autolayout本身提供的代码,不过我相信大多数人使用的感觉是很不友好。

而masonry就是为了解决手写界面适配问题而出现的。是目前最流行的autolayout框架

masonry使用

masonry 在github的地址

masonry 的安装

masonry 是使用cocoaPod 管理的 在PodFile 文件中加入 pod 'Masonry' 并使用pod install 安装。

demo1

设置一个view,位于视图最中心,且长宽为200

[self.blueView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(CGSizeMake(200, 200));
        make.center.equalTo(self.view);
    }];

运行效果:

将长宽改为150,其他不变

 [self.blueView mas_updateConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(CGSizeMake(150, 150));
    }];

运行效果

使用重置约束将长宽修改为200

 [self.blueView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.size.mas_equalTo(CGSizeMake(200, 200));
    make.center.equalTo(self.view);
}];

[self.blueView mas_updateConstraints:^(MASConstraintMaker *make) {
    make.size.mas_equalTo(CGSizeMake(150, 150));
}];

[self.blueView mas_remakeConstraints:^(MASConstraintMaker *make) {
    make.size.mas_equalTo(CGSizeMake(200, 200));
}];

运行效果

上面的demo展示了masonry的三种约束管理

  1. mas_makeConstraints 用于初始化的增加约束
  2. mas_updateConstraints 当需要修改约束时调用
  3. mas_remakeConstraints 移除所有约束再修改

2和3的区别在于一个是直接覆盖之前的约束,另一个是移除所有的约束再修改

如果我们使用连续mas_makeConstraints来进行修改,也可以修改的,但是会报异常信息,建议严格按照上面的方法来编写。

demo2

设置一个视图,包含三个view:

1.ViewA距离顶部10,距离左边20,距离右边20,高度为父视图的1/3;

2.ViewB顶部距离ViewA底部10,距离底部10,距离左边10,宽为ViewA宽度的三分之一,高为ViewA的3倍

3.ViewC左边距离ViewB右边10,顶部距离ViewA底部10,距离右边10,距离底部10

 [self.viewA mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.and.left.equalTo(self.view).with.offset(10);
        make.right.equalTo(self.view).with.offset(-10);
        make.height.equalTo(self.view).with.multipliedBy(1/3.0);
    }];
    
    [self.viewB mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.viewA.mas_bottom).with.offset(10);
        make.left.equalTo(self.view).with.offset(10);
        make.bottom.equalTo(self.view).with.offset(-10);
        make.width.equalTo(self.view).with.multipliedBy(0.5);
    }];
    
    [self.viewC mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.viewA.mas_bottom).with.offset(10);
        make.left.equalTo(self.viewB.mas_right).with.offset(10);
        make.right.equalTo(self.view).with.offset(-10);
        make.bottom.equalTo(self.view).with.offset(-10);
    }];

运行效果

总结

1.常用的约束为offset(位移),和multipliedBy(倍率),注意offset和iOS本身的坐标系一致,有正负之分

2.make.equalTo,make.greaterThanOrEqualTo make.lessThanOrEqualTo 比较

3.添加约束必须在该控件已经添加到父控件之后

4.注意equalTo与mas_equalTo的区别 mas_equalTo增加了类型转换

#define mas_equalTo(...) equalTo(MASBoxValue((__VA_ARGS__)))

当使用and连接时,用equalTo

make.top.and.left.equalTo(self.view).with.offset(10);

Reveal工具

手写代码的效率,主要是不能实时看到效果的缘故,可以使用Reveal工具来动态调整UI,当然最终还是要在代码里改变。类似于html的UI调试。


Comments