现在首先,我不是在问如何添加手势识别器或如何创建按钮。我想要的是知道“有人以任何方式触摸屏幕”,而不会干扰相关的屏幕元素。
问题是我有用户可以点击的元素(太棒了,不是吗?)。然后我有一个覆盖在所有内容之上的视图(window addSubview)。这个视图显示有一些延迟,我希望应用程序的行为好像这个视图不存在,直到它的“显示”动画开始。然后,如果用户点击任何提到的元素,这些元素不是并且不能全部是叠加视图的超视图,则元素应该像往常一样突出显示并触发,而要覆盖的视图应该取消其显示动画(alpha 0-> ; 1)并从层次结构中删除自己。
tl; dr:如何监听屏幕上任何对象的任何事件,而无需编写显式代码来“观察”每个对象 - 我只想知道一个手势发生,不是在哪里,不是如何,不是什么?而且我不想搞砸作为事件接收者的观点。这甚至可能吗?
答案 0 :(得分:2)
您需要将主窗口子类化,然后您将在那里找到所有触摸事件。在UIWindow
中有一个名为sendEvent:
的方便的catch-all方法,它可以看到事件处理管道开始附近的每个事件。如果你想做任何非标准的额外事件处理,这是一个放置它的好地方。像这样:
- (void)sendEvent:(UIEvent *)event {
if ([self eventIsNoteworthy:event]) [self extraEventHandling:event];
[super sendEvent:event]; // Apple says you must always call this!
}
文档:UIWindow class reference | iOS event delivery docs
This blog post还提到如何覆盖hitTest:withEvent:
以捕获某些事件,然后将它们绑定到视图层次结构中的目标叶子视图。如果需要,您还可以在UIWindow
对象上覆盖该方法。
注意:您不会通过此解决方案获得键盘触摸事件。
答案 1 :(得分:1)
在叠加层视图中,按以下方式覆盖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
}
结果是,如果点击叠加视图,它会响应(通过“点击视图”输出到控制台的证明),但它允许点击落入其后面的任何内容(因为它返回{{ 1}})。实际上,这是一种不可触摸的观点,但却知道它什么时候被触及。