Last active
August 29, 2015 14:18
-
-
Save Koze/583041351b9de2640a0f to your computer and use it in GitHub Desktop.
Hook addGestureRecognizer:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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