ViewControllerのPresentationがOverCurrentContexだと元のViewContorollerに戻った時にviewWillAppearが呼び出されない


Xcode10.0
swiftで、`ViewController`に、別の`ViewController`をポップアップウインドウのようにように表示しています。  
別の`ViewController`からは`dismiss(animated: true, completion:
nil)`で元の`ViewContoroller`で戻っています。

  * 別の`ViewController`の`Presentation`が`FullScreen`だと元の`ViewController`の`viewWillAppear`が呼び出されます
  * 別の`ViewController`の`Presentation`が`OverCurrentContext`だと元の`ViewController`の`viewWillAppear`が呼び出されません

`viewWillAppear`が呼び出されない理屈はわかりますが、`Presentation`が`OverCurrentContext`でも`viewWillAppear`を呼び出す方法をどちらかご教授ください。




`UIViewController`の`beginAppearanceTransition(_:animated:)`と`endAppearanceTransition()`を呼ぶことで、ビューコントローラの表示非表示が変わったことを伝えることができます。

本来はコンテナビューコントローラから内包する子のコントローラにライフサイクルを伝播させるためのメソッドですが、方向が逆になるだけで本来の使い方と同等なのでワークアラウンドとしては妥当なところでしょう。

仮に、単に`present(_:animated:completion:)`メソッドでビューコントローラを表示しているだけなら、表示される側のビューコントローラの各ライフサイクルメソッドの中で次のような順序でこのメソッドを呼び出せば、`modalPresentationStyle
= .fullScreen`の場合と同じ結果が得られます。

トランジションをカスタマイズしている場合は、トランジションの開始と終了の時点で適切にこれらのメソッドを呼び出します。

[code]

    class ViewController2: UIViewController {
        override func viewWillAppear(_ animated: Bool) {
            presentingViewController?.beginAppearanceTransition(false, animated: animated)
            super.viewWillAppear(animated)
        }
    
        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
            presentingViewController?.endAppearanceTransition()
        }
    
        override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)
            presentingViewController?.beginAppearanceTransition(true, animated: animated)
            presentingViewController?.endAppearanceTransition()
        }
    
        override func viewDidDisappear(_ animated: Bool) {
            super.viewDidDisappear(animated)
        }
        ...
    
[/code]




`UIViewController`の`beginAppearanceTransition(_:animated:)`と`endAppearanceTransition()`を呼ぶことで、ビューコントローラの表示非表示が変わったことを伝えることができます。

本来はコンテナビューコントローラから内包する子のコントローラにライフサイクルを伝播させるためのメソッドですが、方向が逆になるだけで本来の使い方と同等なのでワークアラウンドとしては妥当なところでしょう。

仮に、単に`present(_:animated:completion:)`メソッドでビューコントローラを表示しているだけなら、表示される側のビューコントローラの各ライフサイクルメソッドの中で次のような順序でこのメソッドを呼び出せば、`modalPresentationStyle
= .fullScreen`の場合と同じ結果が得られます。

トランジションをカスタマイズしている場合は、トランジションの開始と終了の時点で適切にこれらのメソッドを呼び出します。

[code]

    class ViewController2: UIViewController {
        override func viewWillAppear(_ animated: Bool) {
            presentingViewController?.beginAppearanceTransition(false, animated: animated)
            super.viewWillAppear(animated)
        }
    
        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
            presentingViewController?.endAppearanceTransition()
        }
    
        override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)
            presentingViewController?.beginAppearanceTransition(true, animated: animated)
            presentingViewController?.endAppearanceTransition()
        }
    
        override func viewDidDisappear(_ animated: Bool) {
            super.viewDidDisappear(animated)
        }
        ...
    
[/code]

