2

我正在编写一个 ios swift 应用程序,我想包括对摇动设备的支持。至于现在我想在用户摇动手机时向控制台打印一条消息。我找到了这个教程http://www.ioscreator.com/tutorials/detect-shake-gesture-ios8-swift,它看起来超级简单,但是有一件事让我很困扰。

我希望它可以从应用程序的任何视图中工作,而不仅仅是一个视图。因此,无论用户当前在应用程序中的哪个位置 - 他都应该能够调用摇动方法。那么我应该override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent) {在每个面板中实现该方法吗?或者有没有办法实现一次并在整个应用程序中填充它?

4

1 回答 1

8

首先让我们找出这些“运动”方法的来源,正如文档所说:

UIResponder 类为响应和处理事件的对象定义了一个接口。它是 UIApplication、UIView 及其子类的超类。(https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIResponder_Class/

运动事件的事件处理方法有:

func motionBegan(motion: UIEventSubtype, withEvent event: UIEvent?)
func motionCancelled(motion: UIEventSubtype, withEvent event: UIEvent?)
func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?)

因此,如您所见,要在应用程序的每个屏幕上“捕捉”运动事件 - 我们应该在这些屏幕中覆盖这些方法。感谢上帝,有了扩展 - 我们可以让它变得更容易:)

为了包含“运动”逻辑,让我们创建一个协议并将其命名为“MotionDelegate”:

protocol MotionDelegate {
func motionBegan(motion: UIEventSubtype, withEvent event: UIEvent?)
func motionCancelled(motion: UIEventSubtype, withEvent event: UIEvent?)
func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?)

}

并对 UIViewController 进行扩展,符合 MotionDelegate 协议:

extension UIViewController:MotionDelegate {
override public func becomeFirstResponder() -> Bool {
    return true
}

override public func motionBegan(motion: UIEventSubtype, withEvent event: UIEvent?) {
    if motion == .MotionShake { print("Shaking motionBegan with event\(event)") }
}

override public func motionCancelled(motion: UIEventSubtype, withEvent event: UIEvent?) {
    if motion == .MotionShake { print("Shaking motionCancelled with event\(event)") }
}

override public func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) {
    if motion == .MotionShake { print("Shaking motionEnded with event\(event)") }
}

}

通过这种方式,运动处理将在您的应用程序的每个 UIViewController 实例上工作。

要处理某些特定 vc 上的运动事件,您应该在其扩展中覆盖它:

extension MotionViewController {
override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) {
    if motion == .MotionShake {
        print("MotionViewController Shaking motionEnded with event\(event)")
    }
}

}

希望能帮助到你!

于 2016-04-18T14:08:23.797 回答