iOS
Swift

AutoLayout でレイアウトした コンテナ ViewController 内の ViewController をアニメーションして入れ替える

More than 3 years have passed since last update.

そもそも Container View Controlloer を設定する方法は下記を参考に。

カスタムContainer View Controllerを作る

下記は AutoLayout で実行した例。ただしアニメーション開始位置だけは簡便のため frame を使っている。

    func transientToViewController(newMainVC : UIViewController ){

let currentVC = self.currentVC // この例ではインスタンス変数で保持しています。もしくは引数で渡したりしてください。
currentVC.willMoveToParentViewController(nil)
self.addChildViewController(newMainVC)
self.view.addSubview(newMainVC.view)

// アニメーション開始前の初期位置を設定 ここでは上部からスライドするように設定
let width = currentVC.view.bounds.size.width
let height = currentVC.view.bounds.size.height
newMainVC.view.frame = CGRectMake(0 , -height ,width,height)

self.transitionFromViewController(
currentVC,
toViewController: newMainVC,
duration: 0.25,
options: [ UIViewAnimationOptions.TransitionNone ], // ここのオプションを変えると紙をめくるようなエフェクトになったりする
animations: {
self.rebuildConstraints() // 最終的なレイアウトを行う
self.view.layoutIfNeeded() // **これ重要** これがないとアニメーションしない
},
completion: { (success : Bool) in
currentVC.view.removeFromSuperview()
currentVC.removeFromParentViewController()
self.prevViewController = currentVC

})

}

AutoLayout で やるには animations の中で layoutIfNeeded を呼び出さないとアニメーションしないことに気がつかなくて結構はまった。