iOS开发Masonry框架源码解析
前言:这个框架编程思想主要包括链式编程
这是一个iOS在控件布局中的轻量级框架,简化了NSLayoutConstraint的使用方式,让我们用链式变成的思想进行对View控件的约束。
本篇主要围绕Masonry框架源码进行解析,从而透析Masonry是如何对NSLayoutConstraint进行封装的。
####1.OC中的链式编程是如何实现的?
链式编程的好处:
点语法+事物+串联
1.简化代码
2.代码可读性高
调用:
self.where.select;
- (ViewController*)where{
return self;
}
- (void)select{
}
用getter+有参数的时候应该如何写呢?
- (ViewController*)where{
return self;
}
//block有保存代码块的特性
- (void(^)(NSString*))select{
void(^block)(NSString *word) = ^(NSString *str){
};
}
举个栗子:self.where.select(@“参数”)。
#####2.框架解析正文
Masonry框架和NSLayoutConstraint调用的对比:
###实际应用:
#####1.对谁做约束
View+MASAdditions 就是 Masonry 的一个外部的入口,实质上就是 UIView 的一个 Category 作用就是用来设置 MASViewAttribute 的属性,并实例化,并且指定当前的 UIView 对应的约束(LayoutAttribute)
MASUtilities.h 主要是这里除了平台相关代码外,还有些宏的定义和静态方法。Masonry 也对 iOS 和 macOS 做了兼容,在 macOS 里就是 NSView。
其中静态方法
static inline id _MASBoxValue(const char *type, ...)
是我们经常使用的 mas_equalTo 这个方法,这里可以看到它是如何支持变参和如何将 float,double,int 这样的值类型数据转换成和 equalTo 一样的对象 NSNumber 数据的。这个写法灵感来自GitHub - specta/expecta: A Matcher Framework for Objective-C/Cocoa 。 mas_equalTo 和 equalTo 都是宏定义的。
#define mas_equalTo(...) equalTo(MASBoxValue((__VA_ARGS__)))
#define MASBoxValue(value) _MASBoxValue(@encode(__typeof__((value))), (value))
#define equalTo(...) mas_equalTo(__VA_ARGS__)
方法实现:
- (MASConstraint * (^)(id))equalTo {
return ^id(id attribute) {
return self.equalToWithRelation(attribute, NSLayoutR