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的三种约束管理
- mas_makeConstraints 用于初始化的增加约束
- mas_updateConstraints 当需要修改约束时调用
- 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调试。