【问题标题】:Detecting shake in AppDelegate在 AppDelegate 中检测抖动
【发布时间】:2016-04-18 19:14:21
【问题描述】:

如何在 Swift 的 AppDelegate 中(跨整个应用程序)检测设备抖动?

我找到了描述如何在视图控制器中执行此操作的答案,但希望在我的应用程序中执行此操作。

【问题讨论】:

标签: ios swift swift3 appdelegate shake


【解决方案1】:

在您的AppDelegate 中添加以下 sn-p:

override func motionBegan(motion: UIEventSubtype, withEvent event: UIEvent?) {
    if motion == .MotionShake {
        print("Device shaken")
    }
}

Swift 3.0 版本:

override func motionBegan(_ motion: UIEventSubtype, with event: UIEvent?) {
    if motion == .motionShake {
        print("Device shaken")
    }
}

至于以后的版本,这似乎不再起作用了。您需要在视图控制器中添加上述代码

【讨论】:

  • 这不起作用,因为应用程序委托不在响应者链中。
  • @SaRaVaNaNDM,确定它刚刚测试过并且之前已经测试过。你有没有得到任何错误?你是如何实现的?
  • 与您在 Swift 3.0 版本中建议的方式相同。我还需要做什么吗?
  • 上面的代码就足够了。你是在真机上试用吗? @SaRaVaNaNDM
  • 在真机 iPad 2/9.3 上工作,我用的是 swift 3.0.2。
【解决方案2】:

如果要全局检测摇晃动作,UIWindow 实现了可以接收摇晃动作事件的 UIResponder。可以在AppDelegate中添加如下sn -p

extension UIWindow {
    open override func motionEnded(_ motion: UIEventSubtype, with event: UIEvent?) {
        if motion == .motionShake {
            print("Device shaken")
        }
    }
}

【讨论】:

  • 这对我有用。当我把它放在应用程序委托中时,只是添加它(没有 UIWindow 扩展)不起作用。必须在 iOS 10.3/Xcode8.3 的 func 前面添加 open
  • 很奇怪,motionBegan 被调用,但 motionEnded 没有。
  • 在尝试了许多其他解决方案之后,这是唯一适合我的解决方案。另外,我了解到我可以覆盖扩展中的函数。太棒了!
  • 使用扩展的坏主意。提供你自己的子类,在里面定义方法。见stackoverflow.com/a/10580083/1633251。然后,您可以将事件传递给 super - 也许那里需要它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 2021-09-02
  • 2017-04-29
  • 1970-01-01
相关资源
最近更新 更多