web-dev-qa-db-ja.com

シェイクジェスチャーを検出IOS=Swift

私はジェスチャシステムを使用してアプリを開発しています。基本的にiPhoneを左に回すとアプリが機能し、iPhoneを右に回すと他の機能、他のジェスチャで機能します。

私はそれでどのように働くのか分かりません、私はグーグルで検索を試みていますが動作しません、結果はタッチジェスチャーであり、モーションジェスチャーではありません。

誰かが私を助けるためのチュートリアルを持っていますか?

20
FelipeRsN

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: UIEventSubtype, with event: UIEvent?) {
    if motion == .motionShake {
        print("Why are you shaking me?")
    }
}
56
Speedy99

実装が非常に簡単:

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")
    }
}
16
Ryan Dines

これはIOS 12-参照 Apple Docs に更新されました。becomeFirstResponder()メソッドを追加する必要はなくなりました。

必要なのは、motionEnded関数をコードに追加することだけです。

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

Swift 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
      }
 }
3
swiftBoy

Speedy99のSwift回答は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?");
    }
}
1
Prakash

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

}
1
user2168735

Swift Docs:- https://developer.Apple.com/documentation/uikit/uiresponder

モーションイベントを検出するためにSwiftは3つの方法を提供しています:-

  1. func motionBegan()->動きが始まったことをレシーバに伝えます

  2. func motionEnded()->モーションイベントが終了したことをレシーバーに通知します

  3. func motionCancelled()->モーションイベントがキャンセルされたことをレシーバーに通知します

たとえば、シェイクジェスチャーの後に画像を更新する場合

class ViewController: UIViewController {
   override func motionEnded(_ motion: UIEvent.EventSubtype, with event: 
                                                                        UIEvent?) 
   {
        updateImage()
   }

   UpdateImage(){
      // Implementation
   }
}
0
Kathi Shiva Ram