新建三个类 UIWindow, UIController, UIView;
这三个类,分别写上其
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event 方法
UIController
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
NSLog(@"controller1 touchBegan");
[supertouchesBegan:touches withEvent:event];
NSLog(@"controller2 touchBegan");
}
UIView
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
NSLog(@"the1 Touch view");
[supertouchesBegan:touches withEvent:event];
NSLog(@"the2 Touch view");
}
程序运行结果:
test_touch[5497:227250] the1 Touch view
test_touch[5497:227250] controller1 touchBegan
test_touch[5497:227250] controller2 touchBegan
test_touch[5497:227250] the2 Touch view
//分发事件
- (void)sendEvent:(UIEvent *)event {
// NSLog(@"sendEvent1 TouchWindow");
[super sendEvent:event];
// NSLog(@"sendEvent2 TouchWindow");
}
我们知道事件的分发是由Application到Window再到各级View的,所以显然最安全可靠的拦截地方是Application。这里拦截事件后如果不手动往下分发,则进入hit-test View过程的机会都没有。
UIApplication和UIWindow都有sendEvent:方法,用来分发Event。我们可以继承类,重新实现sendEvent:方法,这样就可以拦截下事件,完成一些特殊的处理。