Questo sembra essere un problema classico. Nel mio caso ho voluto intercettare alcuni eventi nel corso di un UIWebView che non può essere sottoclassi, ecc ecc
Ho trovato che il modo migliore per farlo è quello di intercettare gli eventi utilizzando l'UIWindow:
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
Creare quella classe, modificare la classe del vostro UIWindow nel vostro MainWindow.xib a EventInterceptWindow, t da qualche parte impostare eventInterceptDelegate su un controller di visualizzazione che si desidera intercettare gli eventi. Esempio che intercetta un doppio tocco:
- (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;
}
informazioni correlate qui: http://iphoneincubator.com/blog/windows-views/360idev-iphone-developers-conference-presentation
Questo metodo funziona Ottimo ed è più pulito rispetto al metodo degli oggetti sovrapposti. Grazie! –
Davvero un'ottima soluzione, cercavo qualcosa di simile per aggiungere gesti a scrollview/tableview, grazie! :) – Jaanus
Soluzione eccezionale. L'ho fatto funzionare bene per alcuni mesi, catturando un gesto a doppio tocco con 3 dita. Recentemente uno dei miei colleghi più nevrotici è stato in grado di causare un incidente che sembra essere causato da questo.La traccia dello stack non mostra codice obiettivo-c, tuttavia lancia un 'EXEC_BAD_ACCESS' su' [UIScrollViewPanGestureRecognizer toccaCancelled: withEvent:] - [UIApplication _cancelTouches: withEvent: sendingTouchesCancelled: includingGestures:] '. La mia ipotesi è che il primo "3-tap" stia avviando un PanGesture ma poi uccido l'evento (non con grazia). Restituire sempre "NO" lo corregge. –