类目:将TapGesture封装成一个block

上代码.h文件

#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
typedef void(^MyTapGestureRecognizerBlock)();
@interface UIView (TapGestureRecognize)
/**
 *  可用来重新设置点击事件的方法
 */
@property (nonatomic, copy) MyTapGestureRecognizerBlock gestureBlock;
/**
 *  给视图添加一个点击事件
 *  @param action 实现点击事件的方法
 */
- (void)addGestureRecognizerAtction:(MyTapGestureRecognizerBlock __nonnull)action;
@end
NS_ASSUME_NONNULL_END

.m文件

#import "UIView+TapGestureRecognize.h"
#import <objc/runtime.h>
#import <objc/message.h>

@implementation UIView (TapGestureRecognize)

#pragma mark - 动态生成属性
static char gestureBlockKey;
@dynamic gestureBlock;

- (void)setGestureBlock:(MyTapGestureRecognizerBlock)gestureBlock {
    objc_setAssociatedObject(self, &gestureBlockKey, gestureBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (MyTapGestureRecognizerBlock)gestureBlock {
    return objc_getAssociatedObject(self, &gestureBlockKey);
}

#pragma mark - 实现功能方法
- (void)addGestureRecognizerAtction:(MyTapGestureRecognizerBlock)action {
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleMyTapGestureRecognizer)];
    [self addGestureRecognizer:tap];
    self.gestureBlock = action;
    self.userInteractionEnabled = YES;
}

- (void)handleMyTapGestureRecognizer {
    static double preClickTime = -1;
    double curClickTime = [[NSDate date] timeIntervalSince1970];
    if ((curClickTime - preClickTime) > 0.2) {
        self.gestureBlock();
    }
    preClickTime = curClickTime;
}
@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容