https://developer.apple.com/videos/play/wwdc2017/219/
iOSでのユーザー操作の現代的実装にはUIGestureRecognizerが多く使われている。UIGestureRecognizerの基本の復習とiOS11でのアップデート状況。
□基本
UITouch
UIGestureRecognizer
UITouchにより起動されたUIGestureRecognizerの内部状態がどのように変化して、ハンドラーにそれがどう伝達されるかをステップバイステップで図を使って解説。
began
ended
cancelled
moved
failed
等の内部イベント、
possible
failed
の内部状態について説明
□動作原則
Gesture Recognizers first:UIResponderのtouchesBegan等よりも先にUIGestureRecognizerがイベントを取る。
only 1 gesture recognier win:複数のUIGestureRecognizerがある場合でも発火するのは1つだけ。
例外:
gestureRecognizer(_ , shouldRecognizeSimultaneouslyWith otherGestureRecognizer: )
が true を返す場合。複数のUIGestureRecognizerを同時に発火させることができる。
•Failure Requirements
require(toFail: )
other gesture recognizer が failedになるまで(possibleの間は)発火しない。
□実際にユーザーインタラクションを使うための条件
UIView
hitTest → isUserInteractionEnabled → alpha/isHidden → isMultipleTouchEnabled → allowUserInteraction
→アニメーションに関しては別セッション。
□iOS11の新機能(デバッグサポート)
(NEW) UIGestureRecognizer iOS11
name // for debugging
Debugging Hint
po touches.first?.gestureRecognizers
po event?.touches(for:someGestureRecognizer)
po touches.first?.view?.superview?.gestureRecognizers
□Custom UIGestureRecognizersを作るためのヒント
Begin late and fail fast!
□System Gesture Interactionとの関係
iOSでは画面隅でパン動作をするとそれぞれシステムの機能を発動することになる。
下)Multitasking / Dock
右)Slide Over
上)Cover Sheet
・Touch, Long Press等のジェスチャーはSystem, Appは同等の扱い。
・Pan, Swipe動作については、 System 1st, App after
iOS11では、アプリがシステムより優先するための仕組みを提供。
preferredScreenEdgesDeferringSystemGestures()
setNeedsUpdateOfScreenEdgesDeferringSystemGestures()
childViewControllerForScreenEdgesDeferringSystemGestures()
□Drag
UIDragInteraction
内部でUIGestureRecognizerを生成
Long Press and Move activity view controllerを生成
compact environment