UIView 快速添加手势事件(runtime)

2018-12-28  本文已影响2人  ivylee_mr

直接贴代码
需要的朋友直接创建一个UIView 的分类 复制粘贴即可

#import <UIKit/UIKit.h>


@interface UIView (UserInteraction)

/**
 添加手势点击事件

 @param block 回掉
 */
- (void)addTapGestureActionWithBlock:(void (^)(UITapGestureRecognizer *tapAction))block;


/**
 添加手势长按事件

 @param block 回掉
 */
- (void)addLongPressGestureActionWithBlock:(void (^)(UILongPressGestureRecognizer *longPressAction))block;

@end
//
//  UIView+UserInteraction.m
//  FrameWork
//
//  Created by LeeMiao on 2017/9/15.
//  Copyright © 2017年 Limiao. All rights reserved.
//

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

static char const kActionHandlerTapBlockKey;
static char const kActionHandlerTapGestureKey;
static char const kActionHandlerLongPressBlockKey;
static char const kActionHandlerLongPressGestureKey;

@interface UIView ()

@property (nonatomic, strong) NSNumber  *userInteractionNumbers; //

@end

@implementation UIView (UserInteraction)



#pragma mark - gesture block
- (void)addTapGestureActionWithBlock:(void (^)(UITapGestureRecognizer *))block{
    UITapGestureRecognizer *gesture = objc_getAssociatedObject(self, &kActionHandlerTapGestureKey);
    if (!gesture){
        self.userInteractionEnabled = YES;
        gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleActionForTapGesture:)];
        [self addGestureRecognizer:gesture];
        objc_setAssociatedObject(self, &kActionHandlerTapGestureKey, gesture, OBJC_ASSOCIATION_RETAIN);
    }
    objc_setAssociatedObject(self, &kActionHandlerTapBlockKey, block, OBJC_ASSOCIATION_COPY);
}

- (void)handleActionForTapGesture:(UITapGestureRecognizer *)gesture{
    if (gesture.state == UIGestureRecognizerStateRecognized){
        void(^action)(UITapGestureRecognizer *tapAction) = objc_getAssociatedObject(self, &kActionHandlerTapBlockKey);
        if (action){
            action(gesture);
        }
    }
}

- (void)addLongPressGestureActionWithBlock:(void (^)(UILongPressGestureRecognizer *))block{
    UILongPressGestureRecognizer *gesture = objc_getAssociatedObject(self, &kActionHandlerLongPressGestureKey);
    if (!gesture){
        self.userInteractionEnabled = YES;
        gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleActionForLongPressGesture:)];
        [self addGestureRecognizer:gesture];
        objc_setAssociatedObject(self, &kActionHandlerLongPressGestureKey, gesture, OBJC_ASSOCIATION_RETAIN);
    }
    objc_setAssociatedObject(self, &kActionHandlerLongPressBlockKey, block, OBJC_ASSOCIATION_COPY);
}

- (void)handleActionForLongPressGesture:(UILongPressGestureRecognizer *)gesture{
    if (gesture.state == UIGestureRecognizerStateBegan){
        void(^action)(UILongPressGestureRecognizer *longPressAction) = objc_getAssociatedObject(self, &kActionHandlerLongPressBlockKey);
        if (action){
            action(gesture);
        }
    }
}



@end
上一篇下一篇

猜你喜欢

热点阅读