知っておきたかったUIGestureRecognizerとUITouchの違い

D0337ede0237cdaff325101c71617a3b?s=47 Maika Yamada
November 15, 2018
640

 知っておきたかったUIGestureRecognizerとUITouchの違い

D0337ede0237cdaff325101c71617a3b?s=128

Maika Yamada

November 15, 2018
Tweet

Transcript

  1. Copyright 2018 Studyplus, Inc. All Rights Reserved. UIGestureRecognizerとUIResponderの違い Maika Akedo/

    Studyplus Inc. 2018.11.15 @potatotips#56 知っておきたかった
  2. 自己紹介 明渡 麻衣花 スタディプラス 株式会社 開発部 ✎ 事務職→SIer→現職(10月〜) ✎ iOSエンジニア

    ✎ Twitter: @m_yamada0617 ✎ GitHub: @m-yamada04
  3. 学習記録の可視化と、同じ目標を目指す仲間とのSNSでモチベーションを継続できます。 アプリレビュー平均4.5以上。Google Play2年連続ベストアプリ、日本e-Learning大賞(最優秀賞)など受賞多数。 「毎日の勉強を習慣にできない」悩みを解決

  4. 目次 ✎ UIGestureRecognizerとは ✎ UIResponderとは ✎ やりたかったこと ✎ 本題 ✎

    まとめ ✎ 参考
  5. UIGestureRecognizerとは

  6. UIGestureRecognizerとは ✎ ターゲットのViewでどのような操作 が行われたか判定して検知してくれ るクラス ✎ Apple曰く7種類 ‘The concrete subclasses

    of UIGestureRecognizer are the following: •UITapGestureRecognizer •UIPinchGestureRecognizer •UIRotationGestureRecognizer •UISwipeGestureRecognizer •UIPanGestureRecognizer •UIScreenEdgePanGestureRecognizer •UILongPressGestureRecognizer ’
  7. UIResponderとは

  8. UIResponderとは ✎ ユーザーのあらゆる操作(イベント) に応答するクラス ✎ 今回は以下のメソッドが比較対象 ’ func touchesBegan(Set<UITouch>, with:

    UIEvent?) Tells this object that one or more new touches occurred in a view or window. func touchesMoved(Set<UITouch>, with: UIEvent?) Tells the responder when one or more touches associated with an event changed. func touchesEnded(Set<UITouch>, with: UIEvent?) Tells the responder when one or more fingers are raised from a view or window. func touchesCancelled(Set<UITouch>, with: UIEvent?) Tells the responder when a system event (such as a system alert) cancels a touch sequence. ‘
  9. やりたかったこと UIGestureRecognizerとUIResponderの違いを明確に認識したきっかけ

  10. やりたかったこと ✎ タップ位置へ描画 ✎ 長押しで描画したものを移 動 ✎ ダブルタップ拡大・縮小

  11. やりたかったこと ✎ 1回タップ → 描画 ✎ 長押し  →開始位置のオブジェクト有無で処 理が分岐 ✎

    2回タップ →拡大または縮小
  12. やりたかったこと ✎ 1回タップ → UITapGesutureRecognizer   (2回タップ失敗時のみ) ✎ 長押し  →UIPanGestureRecognizer

    ✎ 2回タップ →UITapGesutureRecognizer
  13. 実装

  14. ・・・(・ω・`)?

  15. なんか、遅い

  16. やりたかったこと ✎ タップした瞬間に描画してほしいのに、 タップしてからワンテンポくらい遅れる ✎ 試しにUIResponderで実装してみると タップした瞬間に描画できる

  17. 本題 UIGestureRecognizerとUIResponderの違い

  18. 本題 ✎ 想定している処理の発動速度が違う ✎ ログ出力のみのメソッドを 準備して差分の時間を計測 →UITouchのtouchesBegan〜  UITapGestureRecognizerのSelector

  19. 本題 class TouchView: UIView { var startTime: Date? override open

    func touchesBegan( _ touches: Set<UITouch>, with event: UIEvent?) { startTime = Date() } }
  20. 本題 class ViewController: UIViewController { @IBOutlet var mainView: TouchView! override

    func viewDidLoad() { super.viewDidLoad() let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tapped(_:))) mainView.addGestureRecognizer(tapGesture) } @objc func tapped(_ sender: UITapGestureRecognizer) { let elapsedTime = Date().timeIntervalSince(mainView.startTime!) print("touchesBegan 〜 Selector: \(elapsedTime)") } }
  21. 本題 端末:iPhone XS Simulator touchesBegan 〜 Selector: 0.005764961242675781 touchesBegan 〜

    Selector: 0.6473150253295898 touchesBegan 〜 Selector: 0.19945406913757324 touchesBegan 〜 Selector: 0.22349095344543457 touchesBegan 〜 Selector: 0.008154988288879395 touchesBegan 〜 Selector: 0.2873830795288086 touchesBegan 〜 Selector: 0.11172294616699219 touchesBegan 〜 Selector: 0.38307297229766846 touchesBegan 〜 Selector: 0.005489945411682129 touchesBegan 〜 Selector: 0.15140306949615479
  22. 本題 ✎ UIResponderの処理を前提として、 どのような操作がされたかを判定 ‘ The usual sequence of actions

    in gesture recognition follows a path determined by default values of the cancelsTouchesInView, delaysTouchesBegan, delaysTouchesEnded properties: ‘ UIResponderの touchesCancel, touchesBegan, touchesMoved, touchesEnded が前提
  23. まとめ

  24. まとめ ✎ UIGestureRecognizerで 実装するほうが楽だし見やすい ✎ タップした瞬間、すぐに反映したい処 理を実装する場合は最初から UIResponderを使うと幸せ

  25. 参考 ✎ Apple Developer - https://developer.apple.com/do cumentation/uikit/uigesturerec ognizer - https://developer.apple.com/do

    cumentation/uikit/uiresponder
  26. We’re Hiring! エンジニア募集中 https://info.studyplus.co.jp/recruit

  27. ご静聴ありがとうございました