将摇动手势事件传递给应用程序委托

Posted

技术标签:

【中文标题】将摇动手势事件传递给应用程序委托【英文标题】:Passing shake gesture event to the app delegate 【发布时间】:2012-05-13 18:55:42 【问题描述】:

我将 motionBegan:withEvent: 方法放在我的视图控制器中以查看它是否可以工作,但它没有被调用。在viewWillAppear 中,我将视图控制器设为第一响应者,并从canBecomeFirstResponder 返回YES。

此视图控制器位于拆分视图的主窗格中,因此在我摇动设备之前,第一响应者可能已更改。

但我真正的问题是如何将所有运动事件传递给我的应用委托中的处理程序?我真的必须在所有视图控制器中使用 motionBegan:withEvent: 方法或委托给所有第一响应者吗?难道没有办法让这样的事件在不向每个 UIResponder 中插入代码的情况下沿响应者链向上流动吗?似乎会有,但我还没有弄清楚如何做到这一点。

【问题讨论】:

【参考方案1】:

最简单的方法是在UIApplication 中覆盖-sendEvent:,然后您将可以控制所有事件

你可以使用这个类

int retVal = UIApplicationMain(argc, argv, @"myApplication", @"myAppDelegate");

另一种解决方案是创建类别或扩展-viewWillAppear:more info

【讨论】:

感谢您展示 UIApplication 类和 UIApplicationMain 函数如何与此相关联。这是一个我不熟悉的领域,了解它看起来很有用。如果我理解正确(今晚我会尝试一下),那么,在子类 UIApplication 中,我可以拦截@987654326 中的所有事件@,对我想立即解决的问题(如摇晃动作)采取行动,然后为那些应该进行正常处理的人调用 [super sendEvent:event]。 子类化 UIApplication 工作得很好。对于其他感兴趣的人,即使设备在用户的口袋中,也可能发生抖动事件。将需要一些额外的过滤。【参考方案2】:

我在 pass 中所做的是创建一个 UIWindow 类别,它实现了一个 motionBegan 方法。在那个 motionBegan 方法中,我广播了一个自定义 NSNotification。然后,在应用程序中任何需要运动事件的地方,只需为您的运动通知添加一个观察者。

由于类别向对象的每个实例添加方法,即使是系统创建的窗口也会获取您的 motionBegan 方法,并做正确的事。效果很好。

【讨论】:

如果 UIWindow 不是 firstResponder 的委托,我不确定这是如何工作的。 motionBegan:是 UIRespopnder(或子类 UIResponder)对象的委托中的一个方法,它是 firstResponder。情况可能并非总是如此(通常不是,我敢打赌。)我错了吗?

以上是关于将摇动手势事件传递给应用程序委托的主要内容,如果未能解决你的问题,请参考以下文章

保存并检测特定的摇动手势模式 iphone

Android:将手势事件传递给另一个视图

处理 iPad 摇动手势

将点击事件传递给子视图 iOS

将现有和活动的手势识别器传递给模态视图控制器

Google AdMob 干扰 SwiftUI 中的摇动手势