Dies scheint ein klassisches Problem zu sein. In meinem Fall habe ich einige Ereignisse über einen UIWebView abfangen wollte, die nicht unterklassiert werden können, etc etc.
Ich habe festgestellt, dass der beste Weg, es zu tun ist, um die Ereignisse mit dem UIWindow abfangen:
EventInterceptWindow.h
@protocol EventInterceptWindowDelegate
- (BOOL)interceptEvent:(UIEvent *)event; // return YES if event handled
@end
@interface EventInterceptWindow : UIWindow {
// It would appear that using the variable name 'delegate' in any UI Kit
// subclass is a really bad idea because it can occlude the same name in a
// superclass and silently break things like autorotation.
id <EventInterceptWindowDelegate> eventInterceptDelegate;
}
@property(nonatomic, assign)
id <EventInterceptWindowDelegate> eventInterceptDelegate;
@end
EventInterceptWindow.m:
#import "EventInterceptWindow.h"
@implementation EventInterceptWindow
@synthesize eventInterceptDelegate;
- (void)sendEvent:(UIEvent *)event {
if ([eventInterceptDelegate interceptEvent:event] == NO)
[super sendEvent:event];
}
@end
diese Klasse erstellen, die Klasse Ihres UIWindow in Ihrem MainWindow.xib zu EventInterceptWindow, t ändern Stellen Sie event_interceptDelegate irgendwo auf einen View-Controller ein, der Ereignisse abfangen soll. Beispiel, das ein Doppeltippen ab:
- (BOOL)interceptEvent:(UIEvent *)event {
NSSet *touches = [event allTouches];
UITouch *oneTouch = [touches anyObject];
UIView *touchView = [oneTouch view];
// NSLog(@"tap count = %d", [oneTouch tapCount]);
// check for taps on the web view which really end up being dispatched to
// a scroll view
if (touchView && [touchView isDescendantOfView:webView]
&& touches && oneTouch.phase == UITouchPhaseBegan) {
if ([oneTouch tapCount] == 2) {
[self toggleScreenDecorations];
return YES;
}
}
return NO;
}
Verwandte Informationen hier: http://iphoneincubator.com/blog/windows-views/360idev-iphone-developers-conference-presentation
Diese Methode funktioniert hervorragend und ist sauberer als die Methode der überlagernden Objekte. Danke! –
Wirklich tolle Lösung, war auf der Suche nach etwas wie das Hinzufügen von Gesten zu scrollview/tableview, danke! :) – Jaanus
Tolle Lösung. Ich habe es seit ein paar Monaten gut laufen jetzt eine 3-Finger-Doppeltipp-Geste erfassen. Kürzlich konnte einer meiner eher neurotischen Kollegen einen Absturz verursachen, der dadurch verursacht zu sein scheint.Der Stack-Trace zeigt keinen objective-c-Code, jedoch wird eine 'EXEC_BAD_ACCESS' auf' [UIScrollViewPanGestureRecognizer touchesCancelled: withEvent:] - [UIApplication _cancelTouches: withEvent: sendingTouchesCancelled: includingGestures:] 'geworfen. Meine Hypothese ist, dass der erste "3-Tap" eine PanGesture startet, aber dann töte ich das Event (nicht anmutig). Wenn Sie immer 'NO' zurückgeben, wird es repariert. –