Swap rootViewController with animation? Swap rootViewController with animation? xcode xcode

Swap rootViewController with animation?


You can use UIView.transition(with: view) to replace the rootViewController of a UIWindow:

guard let window = UIApplication.shared.keyWindow else {    return}let storyboard = UIStoryboard(name: "Main", bundle: nil)let vc = storyboard.instantiateViewController(withIdentifier: "MainTabbar")// Set the new rootViewController of the window.// Calling "UIView.transition" below will animate the swap.window.rootViewController = vc// A mask of options indicating how you want to perform the animations.let options: UIView.AnimationOptions = .transitionCrossDissolve// The duration of the transition animation, measured in seconds.let duration: TimeInterval = 0.3// Creates a transition animation.// Though `animations` is optional, the documentation tells us that it must not be nil. ¯\_(ツ)_/¯UIView.transition(with: window, duration: duration, options: options, animations: {}, completion:{ completed in    // maybe do something on completion here})


Swift 4

Paste function into AppDelegate:

func setRootViewController(_ vc: UIViewController, animated: Bool = true) {    guard animated, let window = self.window else {        self.window?.rootViewController = vc        self.window?.makeKeyAndVisible()        return    }    window.rootViewController = vc    window.makeKeyAndVisible()    UIView.transition(with: window,                      duration: 0.3,                      options: .transitionCrossDissolve,                      animations: nil,                      completion: nil)}


An alternative solution:

let stb = UIStoryboard(name: "YOUR_STORYBOARD_NAME", bundle: nil)let rootVC = stb.instantiateViewController(withIdentifier: "YOUR_TABBAR_VIEWCONTROLLER_NAME")let snapshot = (UIApplication.shared.keyWindow?.snapshotView(afterScreenUpdates: true))!rootVC.view.addSubview(snapshot)UIApplication.shared.keyWindow?.rootViewController = rootVCUIView.transition(with: snapshot,                   duration: 0.4,                  options: .transitionCrossDissolve,                  animations: {                       snapshot.layer.opacity = 0                  },                  completion: { status in                       snapshot.removeFromSuperview()                  })