有没有办法收听全局触摸事件?我想在触摸屏幕时收到通知。现在我正在覆盖我的视图上的 TouchesBegan,但它似乎没有冒泡。即,如果我触摸按钮或键盘,则永远不会调用该方法。也许通过使用 NSNotificationCenter 或类似的东西。
谢谢,
有没有办法收听全局触摸事件?我想在触摸屏幕时收到通知。现在我正在覆盖我的视图上的 TouchesBegan,但它似乎没有冒泡。即,如果我触摸按钮或键盘,则永远不会调用该方法。也许通过使用 NSNotificationCenter 或类似的东西。
谢谢,
我在这里发布了一些可能有帮助的代码。但是该代码与 OP 的代码混合在一起,所以这是一个干净的版本。
您可以做的是子类 UIWindow 并将其作为其窗口传递给应用程序委托。
代码看起来像:
MyKindOfWindow.h
#import <UIKit/UIKit.h>
@protocol MyKindOfWindowDelegate;
@interface MyKindOfWindow : UIWindow
@property (assign) id <MyKindOfWindowDelegate> touchDelegate;
@end
@protocol MyKindOfWindowDelegate <NSObject>
@required
- (void) windowTouch:(UIEvent *)event;
@end
MyKindOfWindow.m
#import "MyKindOfWindow.h"
@implementation MyKindOfWindow
@synthesize touchDelegate = _touchDelegate;
- (id)initWithFrame:(CGRect)aRect
{
if ((self = [super initWithFrame:aRect])) {
_touchDelegate = nil;
}
return self;
}
- (void)sendEvent:(UIEvent *)event
{
[super sendEvent: event];
if (event.type == UIEventTypeTouches)
[_touchDelegate windowTouch:event];
}
@end
您AppDelegate
当然需要遵循MyKindOfWindowDelegate
协议(实施- (void) windowTouch:(UIEvent *)event
方法)。
didFinishLaunchingWithOptions:
看起来像:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[MyKindOfWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[(MyKindOfWindow *)self.window setTouchDelegate:self]; //!!make your AppDelegate a delegate of self.window
//this part of code might be different for your needs
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil];
} else {
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil];
}
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
现在我正在覆盖我的视图上的 TouchesBegan,但它似乎没有冒泡。
你是对的——从视图层次结构(即窗口)的根视图开始传递触摸,并在视图层次结构中向下进行,直到找到被触摸的视图。看看 UIView 的-hitTest:withEvent:
方法。从窗口开始,调用该方法以查找命中的子视图,然后在子视图上调用相同的方法,依此类推。