$30 off During Our Annual Pro Sale. View Details »

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

Maika Yamada
November 15, 2018
920

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

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
    知っておきたかった

    View Slide

  2. 自己紹介
    明渡 麻衣花
    スタディプラス 株式会社 開発部
    ✎ 事務職→SIer→現職(10月〜)
    ✎ iOSエンジニア
    ✎ Twitter: @m_yamada0617
    ✎ GitHub: @m-yamada04

    View Slide

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

    View Slide

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

    View Slide

  5. UIGestureRecognizerとは

    View Slide

  6. UIGestureRecognizerとは
    ✎ ターゲットのViewでどのような操作
    が行われたか判定して検知してくれ
    るクラス
    ✎ Apple曰く7種類
    ‘The concrete subclasses of UIGestureRecognizer are the following:
    ●UITapGestureRecognizer
    ●UIPinchGestureRecognizer
    ●UIRotationGestureRecognizer
    ●UISwipeGestureRecognizer
    ●UIPanGestureRecognizer
    ●UIScreenEdgePanGestureRecognizer
    ●UILongPressGestureRecognizer

    View Slide

  7. UIResponderとは

    View Slide

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

    func touchesBegan(Set, with: UIEvent?)
    Tells this object that one or more new touches occurred in a view or window.
    func touchesMoved(Set, with: UIEvent?)
    Tells the responder when one or more touches associated with an event changed.
    func touchesEnded(Set, with: UIEvent?)
    Tells the responder when one or more fingers are raised from a view or window.
    func touchesCancelled(Set, with: UIEvent?)
    Tells the responder when a system event (such as a system alert) cancels a touch
    sequence.

    View Slide

  9. やりたかったこと
    UIGestureRecognizerとUIResponderの違いを明確に認識したきっかけ

    View Slide

  10. やりたかったこと
    ✎ タップ位置へ描画
    ✎ 長押しで描画したものを移

    ✎ ダブルタップ拡大・縮小

    View Slide

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

    View Slide

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

    View Slide

  13. 実装

    View Slide

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

    View Slide

  15. なんか、遅い

    View Slide

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

    View Slide

  17. 本題
    UIGestureRecognizerとUIResponderの違い

    View Slide

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

    View Slide

  19. 本題
    class TouchView: UIView {
    var startTime: Date?
    override open func touchesBegan(
    _ touches: Set, with event: UIEvent?) {
    startTime = Date()
    }
    }

    View Slide

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

    View Slide

  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

    View Slide

  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 が前提

    View Slide

  23. まとめ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide