motionBegan:withEvent:未在iOS 10中的AppDelegate中调用

时间:2016-09-15 19:01:56

标签: ios iphone ios10 uiresponder

我曾经通过简单地实现这个方法来检测来自AppDelegate的摇动:

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    NSLog(@"shake shake shake");
}

在iOS 8和9中运行良好。但它不再适用于iOS 10。 我也尝试过添加

- (BOOL)canBecomeFirstResponder {
        return YES;
}

但这没有任何帮助。这在UIViewControllers中可以正常工作。 iOS 10中有什么变化,还是只是一个bug?

3 个答案:

答案 0 :(得分:7)

我和你有同样的问题。我现在使用UIWindow而不是在AppDelegate上实现它,它在iOS 8-10中适用于我。也许这对你来说也是可行的?

extension UIWindow {

    override open var canBecomeFirstResponder: Bool {
        return true
    }

    override open func motionBegan(_ motion: UIEventSubtype, with event: UIEvent?) {
        if motion == .motionShake {
            //logic here
        }
    }
}

如果您想要更干净,您可以在应用程序上设置UIWindow的专用版本。

答案 1 :(得分:1)

我有一个类似的问题,我尝试了@jayjunck的答案,但Xcode抛出了Method does not override any method from its superclass。我通过将public替换为open来修复它,以访问并覆盖motionBegan函数

extension UIWindow {
override open func motionBegan(_ motion: UIEventSubtype, with event: UIEvent?) {
        super.motionBegan(motion, with: event)

        guard motion == UIEventSubtype.motionShake else { 
            return 
        }

        // Shake is detected 
    }
}

在Swift 3中,

  • open类可以在定义模块之外访问和子类化。开放类成员可在定义模块外部访问和覆盖。

  • 可以访问public类,但不能在定义模块之外进行子类化。公共类成员可以在定义模块之外访问但不可覆盖。

答案 2 :(得分:-2)

您应该在(所有)View Controller中覆盖 motionBegan 方法。