91 votes

Swap rootViewController avec l'animation?

Im essayant de passer à une autre vue de la racine de contrôleur avec une barre d'onglet; par l'intermédiaire du délégué d'application, et je veux ajouter de l'animation de transition. Par défaut, il ne serait que de montrer le point de vue, sans aucune animation.

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

Voilà comment j'ai échangé pour un autre rootview contrôleur.

217voto

d.felber Points 2750

J'ai évalué UIView.transition(from: view, to: view) et UIView.transition(with: view) il y a quelques temps, et qui finit à l'aide de ceci: (mais malheureusement ne me souviens pas pourquoi)

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

31voto

Wiingaard Points 1247

Swift 4

La fonction "coller" dans 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)
}

17voto

Une solution alternative:

let stb = UIStoryboard(named: "Main", bundle: nil)
let rootVC = stb.instantiateViewController(withIdentifier: "TabBarVC")
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()
})

16voto

matt Points 60113

Im essayant de passer à une autre vue de la racine de contrôleur ... et je veux ajouter de l'animation de transition

J'ai une appli qui fait ça: ça change de la vue racine contrôleur de l'animation (il est appelé à l'Albumine).

Mais mon application en réalité n'a pas vraiment changer la vue de la racine de contrôleur. La racine-vue-contrôleur est un conteneur personnalisé-vue-contrôleur qui ne change jamais. Son point de vue n'est jamais vu et il n'a pas de fonctionnalité. Son travail est d'être le lieu où le changement se produit: il swaps un enfant de-vue-contrôleur pour l'autre - et donc le passage oeuvres d'animation.

En d'autres termes, vous ajoutez un point de vue contrôleur à votre vue-contrôleur de la hiérarchie, au sommet de la hiérarchie, et tout le problème est résolu proprement et correctement.

9voto

JPetric Points 2955

Essayez ceci:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X