我曾经通过简单地实现这个方法来检测来自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?
答案 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 方法。