我正在编写一个ios swift应用程序,我希望包含一个摇动设备的支持。至于现在我想在用户摇动手机时将一个msg打印到控制台。我找到了这个教程http://www.ioscreator.com/tutorials/detect-shake-gesture-ios8-swift,它看起来非常简单,但是有一件事困扰着我。
我希望它可以在应用中的任何视图中工作,而不仅仅是单个视图。因此,无论用户当前在应用程序中的哪个位置 - 他都应该能够调用摇动方法。我应该在每个面板中实现方法override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent) {
吗?或者有没有办法实现它一次并在整个应用程序中填充它?
答案 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)")
}
}
}
希望它有所帮助!