Slide 1

Slide 1 text

Copyright 2018 Studyplus, Inc. All Rights Reserved. UIGestureRecognizerとUIResponderの違い Maika Akedo/ Studyplus Inc. 2018.11.15 @potatotips#56 知っておきたかった

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

UIGestureRecognizerとは

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

UIResponderとは

Slide 8

Slide 8 text

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. ‘

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

実装

Slide 14

Slide 14 text

・・・(・ω・`)?

Slide 15

Slide 15 text

なんか、遅い

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

本題 UIGestureRecognizerとUIResponderの違い

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

本題 端末: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

Slide 22

Slide 22 text

本題 ✎ 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 が前提

Slide 23

Slide 23 text

まとめ

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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