Это, по-видимому, классическая проблема. В моем случае я хотел бы перехватывать некоторые события по UIWebView, которые не могут быть наследником, и т.д. и т.п.
Я обнаружил, что лучший способ сделать это, чтобы перехватить события, используя 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
Создать этот класс, изменить класс вашего UIWindow в вашем MainWindow.xib к EventInterceptWindow, т где-нибудь установите eventInterceptDelegate на контроллер вида, который вы хотите перехватить события. Пример, который перехватывает двойное нажатие:
- (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;
}
Связанная информация здесь: http://iphoneincubator.com/blog/windows-views/360idev-iphone-developers-conference-presentation
Этот метод работает отлично и является более чистым, чем метод наложенных объектов. Спасибо! – 2010-01-06 21:02:49
Действительно отличное решение, искал что-то подобное, чтобы добавить жесты в scrollview/tableview, спасибо! :) – Jaanus
Удивительное решение. У меня было хорошо работать в течение нескольких месяцев, фиксируя жест 3 красных пальцев. Недавно один из моих более невротических коллег смог вызвать катастрофу, которая, по-видимому, вызвана этим.Трассировка стека не отображает код цели-c, однако он бросает 'EXEC_BAD_ACCESS' на' [UIScrollViewPanGestureRecognizer touchsCancelled: withEvent:] - [UIApplication _cancelTouches: withEvent: отправкаTouchesCancelled: includingGestures:] '. Моя гипотеза заключается в том, что первый «3-кратный» запускает PanGesture, но затем я просто убиваю событие (не изящно). Всегда возвращающ «НЕТ» исправляет его. –