TransitionControllerではbeginAppearanceTransitionは呼ぶ必要はなさそう

Updated
Oct 4, 2019 8:06 AM
Created
Oct 4, 2019 7:46 AM
Tags
UIKit
Keywords
Date

UIViewControllerには

viewWillAppearとviewWillDisappearを呼びだすための次の二つのメソッドがある

beginAppearanceTransition:animated:

endAppearanceTransition

つい最近まで、画面遷移アニメーションをカスタマイズするTransitionController(UIViewControllerAnimatedTransitioningを用いたオブジェクト)の内部で、適切に呼び出す必要があると思っていたが、どうやら違う様子。

シンプルにボタンを押したら空っぽのViewControllerを表示するプログラムを作り、

遷移元のViewControllerのviewWillDisappearの呼び出しを観測してみる。

breakpointをはり、停止した時のコールスタックを見るとUIPresentationControllerから呼び出されていることがわかる。

image

ここから、viewWillDisappearの呼び出しはPresentationControllerに依存しているという仮説が立つので、

controller.modalPresenationStyleを変更してみる。

すると、`fullScreen`の時は、呼び出され、`overFullScreen`の時は呼び出されない。

法則としては、遷移元のViewController.viewがremoveされるかどうか、というところによる様子。

そこで、viewWillAppear, disappearのドキュメントを改めて読み直すと、

🛵

Notifies the view controller that its view is about to be added to a view hierarchy.

added to a view hierarchy

ということだった。

完全に見逃していたので、これを読むと納得。

ここから、iOS13で話題となった、pageSheetではwillAppear, willDisappearが呼ばれない!と言われていたが、こちらもViewController.viewがヒエラルキーから抜けているわけではないので、呼ばれなくて当然ということになる。

ということから、TransitionControllerからbegin/endは呼ばなくて良い。ということになりそう。

逆に、必要な時に呼んでも良いのか?ということに関しては微妙。

呼び出しの責務はPresentatioControllerにありそうなので、無理にやりたいならCustomなPresentationControllerを作ってあげるべきかもしれない。

ただし、viewWillAppear, disappearのドキュメンテーションに反する動きをしてしまうのはNGと言えるはず。