相信大多数同学都是用过Masonry框架进行布局,他是一个UI布局约束框架;
1、首先Masonry主要用到了Block和链式编程,由于每个View都是可以通过自身实例直接调用,因此可以想到Masonry首先创建了UIView的一个分类“View+MASAdditions.h”;
2、然后创建了一个“MASConstraintMaker.h”来管理相关的约束;
3、约束调用通过
- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *make))block;
进行调用;采用了block作为参数,并且block携带了一个约束管理者参数;
4、布局调用实验使用了链式语法:
[btn mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.top.equalTo(@10);
}];
下面举一个计算的demo说明如何使用链式编程:
为了实现这样一个链式函数操作,我们创建一个基于“NSObject+Hook.h”的分类和“CalcuteManager”类
一、NSObject+Hook.h 方便其它类调用的基类扩展
#import <Foundation/Foundation.h>
#import "CalcuteManager.h"
@interface NSObject (Hook)
- (void)hk_calcute:(void(^)(CalcuteManager *manager))block;
@end
#import "NSObject+Hook.h"
@implementation NSObject (Hook)
- (void)hk_calcute:(void(^)(CalcuteManager *manager))block {
CalcuteManager *manager = [[CalcuteManageralloc]init];
block(manager);
}
二、CalcuteManager.h 计算统计类
#import <Foundation/Foundation.h>
@interface CalcuteManager : NSObject
@property(nonatomic,assign)int result;
- (CalcuteManager *(^)(int num))add;
- (CalcuteManager *(^)(int num))minus;
@end
#import "CalcuteManager.h"
@implementation CalcuteManager
- (CalcuteManager *(^)(int num))add {
return ^(int num){
_result += num;
NSLog(@"add--:%d",_result);
return self;
};
}
- (CalcuteManager *(^)(int num))minus {
return ^(int num) {
_result -= num;
NSLog(@"minus--:%d",_result);
return self;
};
}
@end