【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のようです)
コードで実現する場合は気にすることがちょいちょいあって、忘れがちなので自分用のメモです。
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