不多bb佣盒,直接上干貨
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UIControl (EventInterval)
/// 按鈕響應(yīng)間隔
@property (nonatomic, assign) NSTimeInterval eventInterval;
@end
NS_ASSUME_NONNULL_END
#import "UIControl+EventInterval.h"
#import <objc/runtime.h>
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 {
NSArray<NSString *> *actions = [self actionsForTarget:target forControlEvent:UIControlEventTouchUpInside];
if ([self isKindOfClass:[UIButton class]] && ![NSStringFromSelector(action) isEqualToString:@"_pressedButton:"] && (!kIsEmptyArray(actions) && [actions.firstObject isEqualToString:NSStringFromSelector(action)])) {
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];
__weak typeof(self) weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.eventInterval > 0 ? self.eventInterval : defaultEventInterval * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
weakSelf.eventUnavailable = NO;
});
}
}
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
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者