BlocksKit UITapGestureRecognizer
按钮绑定
// button 点击事件绑定
btn.btn.bk_(whenTapped: {
print("----")
})
添加Tap手势
// 单次点击
- (void)bk_whenTapped:(void (^)(void))block
{
[self bk_whenTouches:1 tapped:1 handler:block];
}
// 点击回调
- (void)bk_whenTouches:(NSUInteger)numberOfTouches tapped:(NSUInteger)numberOfTaps handler:(void (^)(void))block
{
if (!block) return;
UITapGestureRecognizer *gesture = [UITapGestureRecognizer bk_recognizerWithHandler:^(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location) {
if (state == UIGestureRecognizerStateRecognized) block();
}];
[self addGestureRecognizer:gesture];
}
bk_recognizerWithHandler
通过对UIGestureRecognizer的分类动态添加
// 添加手势入口
+ (id)bk_recognizerWithHandler:(void (^)(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location))block
{
return [self bk_recognizerWithHandler:block delay:0.0];
}
// 进一步拆分 bk_recognizerWithHandler
+ (id)bk_recognizerWithHandler:(void (^)(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location))block delay:(NSTimeInterval)delay
{
return [[[self class] alloc] bk_initWithHandler:block delay:delay];
}
// 统一初始化入口 bk_initWithHandler
- (id)bk_initWithHandler:(void (^)(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location))block delay:(NSTimeInterval)delay
{
self = [self initWithTarget:self action:@selector(bk_handleAction:)];
if (!self) return nil;
self.bk_handler = block;
self.bk_handlerDelay = delay;
return self;
}
// bk_handleAction 通过添加的bk_handler变量,点击按钮时,实例化block
- (void)bk_handleAction:(UIGestureRecognizer *)recognizer
{
// bk_handler 通过AssociatedObject关联对象 添加的成员 setter 调用bk_setHandler方法赋值
/*
@property (nonatomic, copy, setter = bk_setHandler:) void (^bk_handler)(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location);
- (void)bk_setHandler:(void (^)(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location))handle {
objc_setAssociatedObject(self, BKGestureRecognizerBlockKey, handler, OBJC_ASSOCIATION_COPY_NONATOMIC);}
*/
void (^handler)(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location) = recognizer.bk_handler;
if (!handler) return;
NSTimeInterval delay = self.bk_handlerDelay;
CGPoint location = [self locationInView:self.view];
void (^block)(void) = ^{
if (!self.bk_shouldHandleAction) return;
handler(self, self.state, location);
};
self.bk_shouldHandleAction = YES;
if (!delay) {
block();
return;
}
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), block);
}
bk_handler
// 声明成员变量的引用
// static const void *BKGestureRecognizerBlockKey = &BKGestureRecognizerBlockKey;
// 属性声明
@property (nonatomic, copy, setter = bk_setHandler:) void (^bk_handler)(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location);
// setter方法
- (void)bk_setHandler:(void (^)(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location))handler {
objc_setAssociatedObject(self, BKGestureRecognizerBlockKey, handler, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
网友评论