话不多说,直接上代码
#import <UIKit/UIKit.h>
@interface UIButton (MPK)
@property (nonatomic, assign) NSTimeInterval eventTimeInterval;
@end
#import "UIButton+MPK.h"
#import <objc/runtime.h>
static const CGFloat defaultInterval = 1;
static const char *MPK_eventTimeInterval = "MPK_eventTimeInterval";
static const char *MPK_eventIsIgnoreEvent = "MPK_eventIsIgnoreEvent";
@interface UIButton ()
@property (nonatomic, assign) BOOL isIgnoreEvent;
@end
// 实现代码
@implementation UIButton (MPK)
#pragma mark - life cycle
+(void)load
{
static dispatch_once_t once_Token;
dispatch_once(&once_Token, ^{
SEL selA = @selector(sendAction:to:forEvent:);
SEL selB = @selector(_mpk_sendAction:to:forEvent:);
Method methodA = class_getInstanceMethod(self, selA);
Method methodB = class_getInstanceMethod(self, selB);
BOOL isAddSuccessed = class_addMethod(self, selA, method_getImplementation(methodB), method_getTypeEncoding(methodB));
if (isAddSuccessed) {
class_replaceMethod(self, selB, method_getImplementation(methodA), method_getTypeEncoding(methodA));
}else {
method_exchangeImplementations(methodA, methodB);
}
});
}
#pragma mark - event
- (void)_mpk_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
{
self.eventTimeInterval = self.eventTimeInterval == 0 ? defaultInterval : self.eventTimeInterval;
if (self.isIgnoreEvent) {
return;
} else if (self.eventTimeInterval > 0) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.eventTimeInterval * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self setIsIgnoreEvent:NO];
});
}
self.isIgnoreEvent = YES;
[self _mpk_sendAction:action to:target forEvent:event];
}
#pragma mark - getter and setter
-(void)setIsIgnoreEvent:(BOOL)isIgnoreEvent
{
objc_setAssociatedObject(self, MPK_eventIsIgnoreEvent, @(isIgnoreEvent), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(BOOL)isIgnoreEvent
{
return [objc_getAssociatedObject(self, MPK_eventIsIgnoreEvent) boolValue];
}
-(void)setEventTimeInterval:(NSTimeInterval)eventTimeInterval
{
objc_setAssociatedObject(self, MPK_eventTimeInterval, @(eventTimeInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(NSTimeInterval)eventTimeInterval
{
return [objc_getAssociatedObject(self, MPK_eventTimeInterval) doubleValue];
}
@end