我怎样才能知道什么时候在屏幕上的任何对象被挖掘?

现在首先,我不问如何添加一个手势识别器或如何创build一个button。 我想知道的是“有人以任何方式触摸屏幕”,而不会干扰相关的屏幕元素。

事情是,我有元素,用户可以挖掘(惊人的,不是吗?)。 然后我有一个视图覆盖了一切(窗口addSubview)。 这个视图出现了一些延迟,我希望应用程序的行为好像这个视图不存在,直到它的“显示”animation开始。 然后,如果用户点击任何提及的元素(不是所有元素都不可以是叠加视图的超级视图),则元素应该像往常一样高亮并触发,而要叠加的视图应该取消其显示animation(alpha 0-> 1)并从层次结构中删除它自己。

tl; dr:我怎样才能听任何事件的屏幕上的任何对象,而不必写明确的代码来“观看”每一个对象 – 我只是想知道一个手势发生,而不是在哪里,不是如何,不随你? 而且我不想混淆事件接收者的观点。 这甚至有可能吗?

你只需要子类化你的主窗口,你会发现所有的触摸事件。 在UIWindow有一个方便的方法叫做sendEvent:它可以看到事件处理pipe道开始附近的每个事件。 如果你想做任何非标准的附加事件处理,这是一个很好的地方。 像这样的东西:

 - (void)sendEvent:(UIEvent *)event { if ([self eventIsNoteworthy:event]) [self extraEventHandling:event]; [super sendEvent:event]; // Apple says you must always call this! } 

Docs: UIWindow类的引用 | iOS事件传递文档

这篇博客文章还提到如何重写hitTest:withEvent:在绑定到视图层次结构中的目标叶子视图之前捕获一些事件。 如果需要,也可以在UIWindow对象上覆盖该方法。

注意:您不会通过此解决scheme获得键盘触摸事件。

在覆盖视图中,重写hitTest:如下所示:

 override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { let result = super.hitTest(point, withEvent:event) if result === self { println("tapped the view") return nil } return result } 

结果是,如果重叠视图被轻敲,它响应(通过“轻敲视图”输出到控制台),但它允许轻击落在它后面的任何东西(因为它返回nil )。 实际上,这是一种不可触及的观点,但它知道什么时候被触摸。