アプリなどを開発するブログ

React Native / Swift / Ruby on Railsなどの学習メモ。


【iOS】フェードで切り替わるContainer ViewController メモ

iOS (or macOS) でアプリを作る際、ログイン中なら普通の画面、未ログインの場合はログイン画面を表示、という処理は頻発すると思います。

モーダルでログイン画面を出すという方法もありますが、色々面倒なのでApple公式で「Container View Controller」と呼ばれている手法で VC1 in VC2 という構造にして、VC1はずっと生きていて、その中の子であるVC2を切り替える、とするのが一般的だと思います。

iOS View Controllerプログラミングガイド: Container View Controller を実装する

Storyboardでは「ContainerView」というパーツがObject Libraryに用意されていますが (実体はUIViewのようです)
f:id:device_me:20180611113840p:plain

コードで実現する場合は気にすることがちょいちょいあって、忘れがちなので自分用のメモです。
switchToメソッドでViewControllerを切り替えます。
遷移時のエフェクトはシンプルなクロスフェードです。

class MainViewController: UIViewController {
    private var currentVC: UIViewController!

    func switchTo(_ newVC: UIViewController) {
        guard let oldVC = currentVC else {
            show(newVC)
            return
        }

        newVC.view.alpha = 0.0
        addChildViewController(newVC)
        oldVC.willMove(toParentViewController: nil)

        transition(from: oldVC, to: newVC, duration: 0.5, options: UIViewAnimationOptions.transitionCrossDissolve, animations: {
            oldVC.view.alpha = 0.0
            newVC.view.alpha = 1.0
        }, completion: { [weak self] _ in
            self?.currentVC = newVC
        })
    }

    private func show(_ vc: UIViewController) {
        currentVC = vc
        addChildViewController(vc)
        view.addSubview(vc.view)
        vc.didMove(toParentViewController: self)
    }
}

参考

www.slideshare.net