Masonry学习理解
iOS中进行屏幕适配,使用的是AutoLayout。在纯代码中可以使用第三方Masonry添加约束进行适配,而使用xib也可以通过加约束来进行适配。关于Masonry介绍可参考资源Masonry官网
Masonry框架介绍?(采用链式编程思想,代码可读性高)
Masonry是一个轻量级的布局框架 拥有自己的描述语法 采用更优雅的链式语法封装自动布局 简洁明了 并具有高可读性 而且同时支持 iOS 和 Max OS X。 Masonry是一个用代码写iOS或os界面的库,可以代替Auto layout。Masonry的github地址
Masonry使用?
Masonry源码理解与探究?
Masonry框架中的核心类:
MASConstraint、MASConstraintMaker、View+MASAdditions、NSArray+MASAdditions等
Masonry核心类的探究:
MASConstraint类:该类继承于NSObject,主要是一些约束方面的东西,比如top、left、right等等,并且该类定义了一些setter和getter方法,下面我截取了一部分该类中的代码
简要分析下offset方法,该方法的具体实现如下:
实在是佩服作者的思维,一般我们使用Block是作为参数,而该方法直接将Block作为返回值。认真理了下,该方法返回值是一个MASConstraint类型的Block而Block的返回值是id类型,在这里应该也是MASConstraint类型或者MASConstraint的子类类型吧,所以Block内部return self。没能理解这样做有什么好处~ 或许这就是链式编程的思想吧,思考中·····
MASConstraintMaker类:继承于NSObject类,主要是用于创建约束。定义了一些MASConstraint类型的属性值。如下:
具体不再说明,大家可以去阅读Masonry的源码。
View+MASAdditions类:为UIView添加的一个类目,添加了一些MASViewAttribute类型的属性,定义了一些添加约束的方法。如下:
这些属性是我们使用Masonry为view添加约束经常用到的,下面我们来看看它内部的方法:
如上,使用Masonry就知道常用的方法就有mas_makeConstraints,下面我们看看这个方法的实现:
NSArray+MASAdditions:
该类是NSArray的一个类目,定义如下:
发现一个奇怪的地方,在View+MASAdditions这个类和NSArray+MASAdditions这个类都出现了mas_makeConstraints方法且返回值类型和参数类型都是一样的。处于好奇一定要看看它们有什么不一样。
除了调用的对象不一样,不难发现它们的实现也是不一样的,虽然返回的都是NSArray类型对象,但是NSArray对象里面所装的东西也不一样,在UIView类目里面的mas_makeConstraints方法返回的数组所装的都是当前view对象映射的一组MASConstraint类型对象,而NSArray类目中mas_makeConstraints方法返回的数组对象所装的都是一组view关于各自映射的MASConstraint类型对象的数组,这样的解释有点儿绕~
直接就是:
在UIView的分类中mas_makeConstraints返回的是装着N(N>=0)个MASConstraint对象的数组;
在NSArray的分类中mas_makeConstraints返回的是装着N(N>=0)个上面的数组的数组。
个人总结
在学习和使用Masonry过程中个人觉得比较值得学习的有以下几点:
链式编程的思想,更利于代码的阅读和理解;
将Block作为函数的返回值使用;
以上是个人对于Masonry的一些学习和理解,若有错误的地方希望大家指出~ 也欢迎大家一起探讨和学习~