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() })