More Related Content
Similar to SioriでどのようにCustom Transitionを実装しているのか
Similar to SioriでどのようにCustom Transitionを実装しているのか (20)
SioriでどのようにCustom Transitionを実装しているのか
- 3. 弥真(やしん) フィラース
!
2013年5月よりウォンテッドリー株式会社にデ
ザイナーとして参加。
!
UI/UXの設計・デザインはもちろん、フロント
エンドの実装もやってます(Web、アプリ両方)
!
詳しいプロフィール
→https://www.wantedly.com/users/42889
- 8. Push / Popの場合
pushまたはpopViewControllerでviewcontroller間の移動
開始
navigation controllerのdelegateメソッドである
‑navigationController: animationControllerForOperation:
fromViewController: toViewController:
が呼ばれる
animationControllerを返す
- 9. Push / Popの場合
pushまたはpopViewControllerでviewcontroller間の移動
開始
navigation controllerのdelegateメソッドである
‑navigationController: animationControllerForOperation:
fromViewController: toViewController:
が呼ばれる
animationControllerを返す
ここでcustom用のanimationController返す
- 13. 4つ目の要素
Interaction Controller
・UIViewControllerInteractiveTransitioningのprotocolを実装したオブジェクト
!
・interactive transitioningを簡単に実装できる
UIPercentDrivenInteractiveTransitionが用意されている。
!
・アニメーションのタイムラインがあるとして、そのタイムライン上のどこの位置
にいるかを管理する。また、ユーザの入力によってpercentCompleteプロパ
ティを変えることでアニメーションを再生したり巻き戻したりできる。
- 14. 実装の流れ
1. ユーザの入力(ジェスチャー)を検知
!
2. transitionを開始
!
3. animationControllerをnavigationControllerのdelegateに返す
!
4. interactionControllerをnavigationControllerのdelegateに返す
!
5. ユーザの入力からinteractionControllerの状態をアップデートする
!
6. ユーザの入力が終わったらinteraction Controllerにtransitionを
cancelするかfinishするか伝える
- 19. 5. ユーザの入力からinteractionControllerの状態を
アップデートする
・animationControllerのanimateTransitionメソッドがanimationのタイムラ
インを作ってくれる。そのタイムライン上のどこにいるかを判断するために
interactionControllerのupdateInteractiveTransitionメソッドを呼ぶ。
・panGestureのstateがChangeに変わったらジェスチャーの移動距離から
percentを計算してupdateInteractiveTransitionメソッドに引数として
percentを渡してpercentCompletedプロパティをアップデートする。
・ジェスチャーが続いてる間常にアップデートするようにする
- 20. 6. ユーザの入力が終わったらinteraction Controllerに
transitionをcancelするかfinishするか伝える
・panGestureのstateがCancelled、Failed、またはFinished
になったことでジェスチャーが終了したことを検知する
・ジェスチャーが終了したらユーザがtransitionをキャンセルし
たかったのか完了したかったのかを判断して
interactionControllerのcancelInteractiveTransitionまたは
finishInteractiveTransitionメソッドを呼んでtransitionを完了
させる。
- 23. どうやって制御しているか?
・transitionがstartするかしないかはviewControllerで判断する
・interactionControllerからviewControllerにdelegateを貼る
・interactiveTransitionCanStart, interactiveTransitionShouldCancel,
interactiveTransitionShouldFinishなどのdelegateメソッド用意して
viewControllerでそれぞれのinteractionControllerのメソッドを制御する。
!
・UIGestureRecognizerDelegateを利用する
・shouldRecognizeSimultaneouslyWithGestureRecognizerや
gestureRecognizerShouldBeginをうまく利用する。
・たとえばpopするviewがない時はpopのinteractionControllerのgestureの
gestureRecognizerShouldBeginでfalseを返してそもそも反応しないようにする。
!
・viewControllerでisTransitioningプロパティを作ってtransition中かどうかの
フラグを立てる
・transitioning中であればscrollViewのscrollはしないようにするなど。