UIButton防止多次点击

不多bb,直接上干货

#import 

NS_ASSUME_NONNULL_BEGIN

@interface UIControl (EventInterval)

/// 按钮响应间隔
@property (nonatomic, assign) NSTimeInterval eventInterval;

@end

NS_ASSUME_NONNULL_END
#import "UIControl+EventInterval.h"
#import 

static char *const eventIntervalKey = "eventIntervalKey";
static char *const eventUnavailableKey = "eventUnavailableKey";
static NSTimeInterval const defaultEventInterval = 0;

@interface UIControl ()

@property (nonatomic, assign) BOOL eventUnavailable;

@end

@implementation UIControl (EventInterval)

+ (void)load {
    Method method = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));
    Method gf_method = class_getInstanceMethod(self, @selector(gf_sendAction:to:forEvent:));
    method_exchangeImplementations(method, gf_method);
}

#pragma mark - ActionFun
- (void)gf_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {
    if ([self isKindOfClass:[UIButton class]]) {
        if (self.eventUnavailable == NO) {
            self.eventUnavailable = YES;
            [self gf_sendAction:action to:target forEvent:event];
            [self performSelector:@selector(setEventUnavailable:) withObject:@(NO) afterDelay:self.eventInterval > 0 ? self.eventInterval : defaultEventInterval];
        }
    }
    else{
        [self gf_sendAction:action to:target forEvent:event];
    }
}

#pragma mark - setter & getter
- (NSTimeInterval)eventInterval {
    return [objc_getAssociatedObject(self, eventIntervalKey) doubleValue];
}

- (void)setEventInterval:(NSTimeInterval)eventInterval {
    objc_setAssociatedObject(self, eventIntervalKey, @(eventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (BOOL)eventUnavailable {
    return [objc_getAssociatedObject(self, eventUnavailableKey) boolValue];
}

- (void)setEventUnavailable:(BOOL)eventUnavailable {
    objc_setAssociatedObject(self, eventUnavailableKey, @(eventUnavailable), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end

你可能感兴趣的:(UIButton防止多次点击)