振動動作を検出する


KakaoTalkのホームページでshakemotionで2次元スキャンを実現!
ほほほ、しかし彼は私にすべての方法を提供してくれた.
stackoverflowで素敵なものを見つけました.5年前の文章ですが、どうしたらいいか・・・

motionEnded (_:with:)


receiver motion eventの終了を通知します.
func motionEnded(_ motion: UIEvent.EventSubtype, 
            with event: UIEvent?)
パラメータを見て

motion


動作タイプを表すevent-サブタイプ定数.UIEvent.EventSubtypeと認識!普通の動作は揺れです.
種類はいろいろあります.
/// extension UIEvent
public enum EventSubtype : Int {        
        // available in iPhone OS 3.0
        case none = 0

        
        // for UIEventTypeMotion, available in iPhone OS 3.0
        case motionShake = 1

        
        // for UIEventTypeRemoteControl, available in iOS 4.0
				// auido, video에 대한 이벤트를 추적한다!
        case remoteControlPlay = 100

        case remoteControlPause = 101
	
        case remoteControlStop = 102

        case remoteControlTogglePlayPause = 103

        case remoteControlNextTrack = 104

        case remoteControlPreviousTrack = 105

	/// audio, video를 통해 거꾸로 탐색하는 것을 종료하는 이벤트 추적
        case remoteControlBeginSeekingBackward = 106

        case remoteControlEndSeekingBackward = 107

        case remoteControlBeginSeekingForward = 108

        case remoteControlEndSeekingForward = 109
    }

event


motionに関連するイベントを処理するオブジェクト
参考として、UIKITは、応答者に動作イベントの開始と終了のみを通知する.だから真ん中の振動は報告されません...
アクションイベントは、最初の応答者に適切に渡されます.必要に応じてトランスポンダチェーンに転送します.
この方法の基本的な実装は応答チェーンによって伝達される.なんだ.
あ、また後で会います.本当です.

motionBegan(_:with:)


動作活動の開始をreceiverに伝える方法でもあります
パラメータも同じです

motionCancelled(_:with:)


これも同じですアクションアクティビティがキャンセルされた場合に通知します.
でも.Shake motionでは果たしてキャンセルが起こるのか…?ありますか.
ああ...アプリケーションを無効にするか、ウィンドウからモーションイベントを処理するビューを削除すると停止します.
このメソッドは、ジッタが長く続いたときに呼び出されます.本当に歯を食いしばって振って、この方法が呼び出されました.
アクションイベントを処理する応答者は、この方法を実装する必要があります.
従って、実施時には、動作イベント処理に関する状態情報がclean upである!

適用

   override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
        if event?.subtype == .motionShake {
            coordinator?.presentQrView()
        }
   }
    
    override func motionCancelled(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
				print("motionCancelled")
    }
使用するViewControllerでは,動きを検出する方法を誇張した.
コーディネータモードを使用しているので、動きが発生したときにqrViewを表示する方法を呼び出すことができます.
簡単なので、この世界に感謝します.

Responder Chain



イベントはFirstResponderから始まり、ビュー階層-window-appオブジェクトに到達します.
とにかくこれによって.

  • UIView
  • ビューがビューコンソールのルートビューの場合)next応答器はビューコンソールです.
  • でない場合、next応答器はビューの「スーパービュー」
  • を表示する.

  • UIViewController
  • windowのルートビュー)next responderはwindowオブジェクト
  • です.
  • がある場合、next rependerは「ビューコントローラ」
  • を表示します.

  • UIWindow
    Next ResponderはUIアプリケーションです

  • UIApplication
    Next ResponderはAppDelegateです(条件:ビュー、ビューコンテキスト、アプリケーションオブジェクトではなくUI Responderのインスタンスです).
  • ああ👀
    そこで先ほどmotionBegan(~~)メソッドシリーズは基本的に応答チェーンに従って伝達されていたので,応答の例としてイベント処理方法が実現されていなければ,この応答チェーンに従って処理が完了するまで上へ移動する.上昇の意味

    結果



    ビデオだからわからないけど揺れるあの
    笑顔: