여기 IOS 4 및 5에서 ok로 테스트 한 감지기가 있습니다. 경고가 있습니다. 제스처 인식기를 사용하는 경우 UIGestureRecognizerStateEnded 상태가되면 전역 AppTouched를 false로 설정해야합니다.
#import <objc/runtime.h>
Boolean AppTouched = false; // provide a global for touch detection
static IMP iosBeginTouch = nil; // avoid lookup every time through
static IMP iosEndedTouch = nil;
static IMP iosCanedTouch = nil;
// implement detectors for UIView
@implementation UIView (touchesBeganDetector)
- (void)touchesBeganDetector:(NSSet *)touches withEvent:(UIEvent *)event
{
AppTouched = true;
if (iosBeginTouch == nil)
iosBeginTouch = [self methodForSelector:
@selector(touchesBeganDetector:withEvent:)];
iosBeginTouch(self, @selector(touchesBegan:withEvent:), touches, event);
}
@end
@implementation UIView (touchesEndedDetector)
- (void)touchesEndedDetector:(NSSet *)touches withEvent:(UIEvent *)event
{
AppTouched = false;
if (iosEndedTouch == nil)
iosEndedTouch = [self methodForSelector:
@selector(touchesEndedDetector:withEvent:)];
iosEndedTouch(self, @selector(touchesEnded:withEvent:), touches, event);
}
@end
@implementation UIView (touchesCancledDetector)
- (void)touchesCancledDetector:(NSSet *)touches withEvent:(UIEvent *)event
{
AppTouched = false;
if (iosCanedTouch == nil)
iosCanedTouch = [self methodForSelector:
@selector(touchesCancledDetector:withEvent:)];
iosCanedTouch(self, @selector(touchesCancelled:withEvent:), touches, event);
}
@end
// http://stackoverflow.com/questions/1637604/method-swizzle-on-iphone-device
static void Swizzle(Class c, SEL orig, SEL repl)
{
Method origMethod = class_getInstanceMethod(c, orig);
Method newMethod = class_getInstanceMethod(c, repl);
if(class_addMethod(c, orig, method_getImplementation(newMethod),
method_getTypeEncoding(newMethod)))
class_replaceMethod(c, repl, method_getImplementation(origMethod),
method_getTypeEncoding(origMethod));
else
method_exchangeImplementations(origMethod, newMethod);
}
@interface touchDetector : NSObject {}
- (id) init;
@end
@implementation touchDetector
- (id) init
{
if (! [ super init ])
return nil;
SEL rep = @selector(touchesBeganDetector:withEvent:);
SEL orig = @selector(touchesBegan:withEvent:);
Swizzle([UIView class], orig, rep);
rep = @selector(touchesEndedDetector:withEvent:);
orig = @selector(touchesEnded:withEvent:);
Swizzle([UIView class], orig, rep);
rep = @selector(touchesCancledDetector:withEvent:);
orig = @selector(touchesCancelled:withEvent:);
Swizzle([UIView class], orig, rep);
return self;
}
@end
하지만 각보기마다 이렇게해야합니까? –
@mihirpmehta 아니, UIView 클래스에 대해 한 번 수행하십시오. –
안녕하세요 그레이엄 ... 고마워하지만 메인 윈도우와 5 viewController 5 탭에 TabBar 컨트롤러가 ... 나는 그들 중 class_replaceMethod()를 사용할지 모르겠다 ... –