Skip to content

Instantly share code, notes, and snippets.

@zetasq
Created August 26, 2015 14:43
Show Gist options
  • Save zetasq/8f062fd7f56daecc4d35 to your computer and use it in GitHub Desktop.
Save zetasq/8f062fd7f56daecc4d35 to your computer and use it in GitHub Desktop.
Set a button with minimum trigger time for click events
#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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment