Skip to content

Instantly share code, notes, and snippets.

@Koze
Last active August 29, 2015 14:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Koze/583041351b9de2640a0f to your computer and use it in GitHub Desktop.
Save Koze/583041351b9de2640a0f to your computer and use it in GitHub Desktop.
Hook addGestureRecognizer:
#import "ViewController.h"
#import <objc/runtime.h>
static NSMutableDictionary *_stack;
NSString *LogGesture(UIGestureRecognizer *gestureRecognizer);
@interface UIView (LogGesture)
- (void)exchangedAddGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer;
@end
@implementation ViewController
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
Class cls = [UIView class];
Method m1 = class_getInstanceMethod(cls, @selector(addGestureRecognizer:));
Method m2 = class_getInstanceMethod(cls, @selector(exchangedAddGestureRecognizer:));
method_exchangeImplementations(m1, m2);
}
return self;
}
- (void)viewDidAppear:(BOOL)animated
{
NSLog(@"%@", _stack);
}
@end
@implementation UIView (LogGesture)
- (void)exchangedAddGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
{
if (!_stack) {
_stack = [NSMutableDictionary dictionary];
}
NSString *key = NSStringFromClass(self.class);
NSMutableArray *mArray = _stack[key];
if (!mArray) {
mArray = [NSMutableArray array];
_stack[key] = mArray;
}
NSString *string = LogGesture(gestureRecognizer);
[mArray removeObject:string];
[mArray addObject:string];
[self exchangedAddGestureRecognizer:gestureRecognizer];
}
@end
NSString *LogGesture(UIGestureRecognizer *gestureRecognizer) {
id object = [[gestureRecognizer valueForKey:@"targets"] firstObject];
id target = [object valueForKey:@"target"];
Ivar ivar = class_getInstanceVariable([object class], "_action");
SEL action = (__bridge void *)object_getIvar(object, ivar);
NSMutableString *mString = [NSMutableString stringWithFormat:@"%@; action=%@; target=%@;",
NSStringFromClass(gestureRecognizer.class),
NSStringFromSelector(action),
NSStringFromClass([target class])];
if ([gestureRecognizer respondsToSelector:@selector(numberOfTouchesRequired)]) {
NSUInteger number = [(id)gestureRecognizer numberOfTouchesRequired];
if (number != 0) {
[mString appendFormat:@" numberOfTouchesRequired=%lu;", (unsigned long)number];
}
}
if ([gestureRecognizer respondsToSelector:@selector(numberOfTapsRequired)]) {
NSUInteger number = [(id)gestureRecognizer numberOfTapsRequired];
if (number != 0) {
[mString appendFormat:@" numberOfTapsRequired=%lu;", (unsigned long)number];
}
}
return mString.copy;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment