diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2021-06-17 09:50:55 +0200 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2021-06-17 09:50:55 +0200 |
| commit | 3fa72148086744fc8ee4a9e0a33470ffd2b0dab9 (patch) | |
| tree | 44fa6c93333e7cfce4559c142024d2edd48fb335 | |
| parent | 84cc39ec70d4e7ef25a3941ad60537c347830c61 (diff) | |
| parent | da321a25585fd8cde8b116edb1b811feda5df292 (diff) | |
| download | mullvadvpn-3fa72148086744fc8ee4a9e0a33470ffd2b0dab9.tar.xz mullvadvpn-3fa72148086744fc8ee4a9e0a33470ffd2b0dab9.zip | |
Merge branch 'fix-unbalanced-appearance-events'
| -rw-r--r-- | ios/MullvadVPN/RootContainerViewController.swift | 59 |
1 files changed, 49 insertions, 10 deletions
diff --git a/ios/MullvadVPN/RootContainerViewController.swift b/ios/MullvadVPN/RootContainerViewController.swift index dc2cae1025..5ba68f75cf 100644 --- a/ios/MullvadVPN/RootContainerViewController.swift +++ b/ios/MullvadVPN/RootContainerViewController.swift @@ -66,6 +66,8 @@ class RootContainerViewController: UIViewController { private(set) var viewControllers = [UIViewController]() + private var appearingController: UIViewController? + private var disappearingController: UIViewController? private var interfaceOrientationMask: UIInterfaceOrientationMask? var topViewController: UIViewController? { @@ -122,25 +124,33 @@ class RootContainerViewController: UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - topViewController?.beginAppearanceTransition(true, animated: animated) + if let childController = topViewController { + beginChildControllerTransition(childController, isAppearing: true, animated: animated) + } } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) - topViewController?.endAppearanceTransition() + if let childController = topViewController { + endChildControllerTransition(childController) + } } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) - topViewController?.beginAppearanceTransition(false, animated: animated) + if let childController = topViewController { + beginChildControllerTransition(childController, isAppearing: false, animated: animated) + } } override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) - topViewController?.endAppearanceTransition() + if let childController = topViewController { + endChildControllerTransition(childController) + } } // MARK: - Autorotation @@ -333,9 +343,12 @@ class RootContainerViewController: UIViewController { // Finish appearance transition if shouldHandleAppearanceEvents { - sourceViewController?.endAppearanceTransition() - if sourceViewController != targetViewController { - targetViewController?.endAppearanceTransition() + if let sourceViewController = sourceViewController { + self.endChildControllerTransition(sourceViewController) + } + + if let targetViewController = targetViewController, sourceViewController != targetViewController { + self.endChildControllerTransition(targetViewController) } } @@ -378,9 +391,11 @@ class RootContainerViewController: UIViewController { // Begin appearance transition if shouldHandleAppearanceEvents { - sourceViewController?.beginAppearanceTransition(false, animated: shouldAnimate) - if sourceViewController != targetViewController { - targetViewController?.beginAppearanceTransition(true, animated: shouldAnimate) + if let sourceViewController = sourceViewController { + beginChildControllerTransition(sourceViewController, isAppearing: false, animated: shouldAnimate) + } + if let targetViewController = targetViewController, sourceViewController != targetViewController { + beginChildControllerTransition(targetViewController, isAppearing: true, animated: shouldAnimate) } } @@ -505,6 +520,30 @@ class RootContainerViewController: UIViewController { } } + private func beginChildControllerTransition(_ controller: UIViewController, isAppearing: Bool, animated: Bool) { + if appearingController != controller, isAppearing { + appearingController = controller + controller.beginAppearanceTransition(isAppearing, animated: animated) + } + + if disappearingController != controller, !isAppearing { + disappearingController = controller + controller.beginAppearanceTransition(isAppearing, animated: animated) + } + } + + private func endChildControllerTransition(_ controller: UIViewController) { + if controller == appearingController { + appearingController = nil + controller.endAppearanceTransition() + } + + if controller == disappearingController { + disappearingController = nil + controller.endAppearanceTransition() + } + } + } class RootContainerPushSegue: UIStoryboardSegue { |
