swift xcode swift3 uiviewanimation rootview

swift - ¿Intercambiar rootViewController con animación?



animation swift (4)

Estoy intentando cambiar a otro controlador de vista raíz con una barra de pestañas; A través de la aplicación delegado, y quiero agregar animación de transición. Por defecto solo mostraría la vista sin ninguna animación.

let tabBar = self.instantiateViewController(storyBoard: "Main", viewControllerID: "MainTabbar") let appDelegate = UIApplication.shared.delegate as! AppDelegate appDelegate.window = UIWindow(frame: UIScreen.main.bounds) appDelegate.window?.rootViewController = tabBar appDelegate.window?.makeKeyAndVisible()

Así es como cambié a otro controlador de rootview.


Estoy tratando de cambiar a otro controlador de vista raíz ... y quiero agregar animación de transición

Tengo una aplicación que hace esto: cambia el controlador de vista raíz con animación (se llama Albumen).

Pero mi aplicación en realidad no cambia el controlador de vista de raíz. El controlador de vista raíz es un controlador de vista de contenedor personalizado que nunca cambia. Su vista nunca se ve y no tiene funcionalidad. Su único trabajo es ser el lugar donde ocurre el cambio: intercambia un controlador de vista secundario por otro, y así funciona la animación de transición.

En otras palabras, agrega un controlador de vista a la jerarquía del controlador de vista, justo en la parte superior de la jerarquía, y todo el problema se resuelve de forma clara y correcta.


Prueba esto:

UIView.transition(from: appdelegate.window.rootViewController!.view, to: tabbar.view, duration: 0.6, options: [.transitionCrossDissolve], completion: { _ in appdelegate.window.rootViewController = tabbar })


Una solución alternativa:

let rootVC = ViewControllers.getInstance.getMainTabBarController() let snapshot = (UIApplication.shared.keyWindow?.snapshotView(afterScreenUpdates: true))! rootVC.view.addSubview(snapshot); UIApplication.shared.keyWindow?.rootViewController = rootVC; UIView.transition(with: snapshot, duration: 0.4, options: .transitionCrossDissolve, animations: { snapshot.layer.opacity = 0; }, completion: { (status) in snapshot.removeFromSuperview() })


UIView.transition(from: view, to: view) y UIView.transition(with: view) algún tiempo y terminé usando esto: (pero desafortunadamente no puedo recordar por qué)

guard let window = UIApplication.shared.keyWindow else { return } guard let rootViewController = window.rootViewController else { return } let storyboard = UIStoryboard(name: "Main", bundle: nil) let vc = storyboard.instantiateViewController(withIdentifier: "MainTabbar") vc.view.frame = rootViewController.view.frame vc.view.layoutIfNeeded() UIView.transition(with: window, duration: 0.3, options: .transitionCrossDissolve, animations: { window.rootViewController = vc }, completion: { completed in // maybe do something here })