|
#import <UIKit/UIKit.h> |
|
#import "objc/runtime.h" |
|
|
|
@interface UIButton (ZS) |
|
|
|
@property (nonatomic, strong) NSDate *associatedTriggerTimeStamp; |
|
@property (nonatomic, strong) NSNumber *associatedMinimumTriggerInterval; |
|
|
|
+ (void) configTriggerMechanism; |
|
|
|
- (void) pSendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event; |
|
|
|
@end |
|
|
|
|
|
|
|
@implementation UIButton (ZS) |
|
|
|
+ (void) configTriggerMechanism { |
|
static dispatch_once_t onceToken; |
|
dispatch_once(&onceToken, ^{ |
|
Method originalMethod = class_getInstanceMethod([self class], @selector(sendAction:to:forEvent:)); |
|
Method evilMethod = class_getInstanceMethod([self class], @selector(pSendAction:to:forEvent:)); |
|
method_exchangeImplementations(originalMethod, evilMethod); |
|
}); |
|
} |
|
|
|
|
|
- (void) setAssociatedTriggerTimeStamp:(NSDate *)associatedTriggerTimeStamp { |
|
objc_setAssociatedObject(self, @selector(associatedTriggerTimeStamp), associatedTriggerTimeStamp, OBJC_ASSOCIATION_RETAIN_NONATOMIC); |
|
} |
|
|
|
- (NSDate *) associatedTriggerTimeStamp { |
|
return objc_getAssociatedObject(self, @selector(associatedTriggerTimeStamp)); |
|
} |
|
|
|
|
|
- (void) setAssociatedMinimumTriggerInterval:(NSNumber *)associatedMinimumTriggerInterval { |
|
objc_setAssociatedObject(self, @selector(associatedMinimumTriggerInterval), associatedMinimumTriggerInterval, OBJC_ASSOCIATION_RETAIN_NONATOMIC); |
|
} |
|
|
|
- (NSNumber *) associatedMinimumTriggerInterval { |
|
return objc_getAssociatedObject(self, @selector(associatedMinimumTriggerInterval)); |
|
} |
|
|
|
- (void) pSendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event { |
|
if (event.type == UIEventTypeTouches && self.isTouchInside) { |
|
if (!self.associatedTriggerTimeStamp || [self.associatedTriggerTimeStamp timeIntervalSinceNow] < -[self.associatedMinimumTriggerInterval doubleValue]) { |
|
NSLog(@"%@ touch success!", [self class]); |
|
self.associatedTriggerTimeStamp = [NSDate date]; |
|
[self pSendAction:action to:target forEvent:event]; |
|
} else { |
|
return; |
|
} |
|
} else { |
|
[self pSendAction:action to:target forEvent:event]; |
|
} |
|
} |
|
|
|
@end |