【问题标题】:Detect shake gesture IOS Swift检测摇晃手势IOS Swift
【发布时间】:2023-03-15 18:34:01
【问题描述】:

我正在开发一个带有手势系统的应用程序,基本上,如果我将 iPhone 向左转,我的应用程序将执行一个功能,如果我将 iPhone 向右转,其他功能,其他手势。

我不知道如何使用它,我正在尝试在 google 中搜索但不起作用,结果只是触摸手势而不是动作手势。

有人有教程可以帮助我吗?

【问题讨论】:

标签: ios iphone xcode swift gesture


【解决方案1】:

Swift3 ios10:

override func viewDidLoad() {
    super.viewDidLoad()
    self.becomeFirstResponder() // To get shake gesture
}

// We are willing to become first responder to get shake motion
override var canBecomeFirstResponder: Bool {
    get {
        return true
    }
}

// Enable detection of shake motion
override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
    if motion == .motionShake {
        print("Why are you shaking me?")
    }
}

【讨论】:

【解决方案2】:

超级容易实现:

1) 让 iOS 知道哪个视图控制器是响应者链中的第一个:

override func viewDidLoad() {
    super.viewDidLoad()
    self.becomeFirstResponder()
}   
override func canBecomeFirstResponder() -> Bool {
    return true
}

2) 以某种方式处理事件:

override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) {
    if(event.subtype == UIEventSubtype.MotionShake) {
        print("You shook me, now what")
    }
}

【讨论】:

    【解决方案3】:

    斯威夫特 5

    只需将以下方法添加到 ViewController 并执行代码

    override func becomeFirstResponder() -> Bool {
        return true
    }
    
    override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?){
        if motion == .motionShake {
            print("Shake Gesture Detected")
            //show some alert here
        }
    }
    

    【讨论】:

    • 你不应该覆盖canBecomeFirstResponder而不是becomeFirstResponder吗?在我将其更改为 canBecomeFirstResponder 之前,这对我不起作用。
    【解决方案4】:

    这已针对 IOS 12 进行了更新 - 请参阅 Apple Docs 您不再需要添加 becomeFirstResponder() 方法。

    您只需将motionEnded 函数添加到您的代码中。

    override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) 
    {
        // code here
    }
    

    【讨论】:

    • 请提供有关becomeFirstResponder的证明或文档链接。
    【解决方案5】:

    Swift 5
    iOS 10+

    UIApplicationUIViewControllerUIViewUIWindow默认都是UIResponder对象,这意味着它们都可以处理运动事件,例如摇晃,无需任何特殊配置。因此,只需覆盖适当的运动方法:

    class YourViewController: UIViewController {
        override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
            if motion == .motionShake {
                print("device did shake")
            }
        }
    }
    

    此外,您可以覆盖motionBegan(_:with:)motionCancelled(_:with:)。并且与覆盖某些触摸事件不同,不需要调用 super。

    【讨论】:

    • 这是正确答案!
    【解决方案6】:

    斯威夫特 5

    class MyViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            self.becomeFirstResponder()
        }
    
        override var canBecomeFirstResponder: Bool {
            get {
                return true
            }
        }
    
        override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
            if motion == .motionShake {
                print("shake")
            }
        }
    
    }
    

    【讨论】:

    • 这只对我有用。将 canBecomeFirstResponder 返回为 true 就可以了。
    【解决方案7】:

    Speedy99 的快速答案在 Objective C 版本中

    - (void)viewDidLoad {
        [super viewDidLoad];
        [self becomeFirstResponder];
    }
    
    - (BOOL)canBecomeFirstResponder{
        return true;
    }
    
    - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{
        if(event.subtype == UIEventSubtypeMotionShake){
           NSLog(@"Why are you shaking me?");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多