繁体   English   中英

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

[英]How can I handle support for shaking the ios device from my swift app?

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

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

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

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)")
    }
}

}

希望能帮助到你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM