如何处理从我的swift应用程序摇动ios设备的支持?

时间:2016-04-18 12:47:11

标签: ios swift uievent

我正在编写一个ios swift应用程序,我希望包含一个摇动设备的支持。至于现在我想在用户摇动手机时将一个msg打印到控制台。我找到了这个教程http://www.ioscreator.com/tutorials/detect-shake-gesture-ios8-swift,它看起来非常简单,但是有一件事困扰着我。

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

1 个答案:

答案 0 :(得分: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)")
    }
}

}

希望它有所帮助!