web-dev-qa-db-de.com

RootViewController gegen Animation tauschen?

Ich versuche, zu einem anderen Root-View-Controller mit einer Tab-Leiste zu wechseln. via app delegate, und ich möchte übergangsanimation hinzufügen. Standardmäßig wird nur die Ansicht ohne Animation angezeigt.

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

So habe ich zu einem anderen Rootview-Controller gewechselt.

37
Chris Mikkelsen

Ich habe vor einiger Zeit UIView.transition(from: view, to: view) und UIView.transition(with: view) ausgewertet und am Ende folgendes verwendet: (kann mich aber leider nicht daran erinnern, warum)

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
})
115
d.felber

Ich versuche, zu einem anderen Stammansichts-Controller zu wechseln ... und ich möchte eine Übergangsanimation hinzufügen

Ich habe eine App, die dies tut: Sie ändert den Root-View-Controller mit Animation (sie heißt Albumen).

Aber meine App ändert tatsächlich nicht den Root-View-Controller. Der Stammansichtscontroller ist ein benutzerdefinierter Containeransichtscontroller, der sich nie ändert. Seine Ansicht wird nie gesehen und es hat keine Funktionalität. Die einzige Aufgabe besteht darin, den Ort zu bestimmen, an dem die Änderung stattfindet: Es wird ein untergeordneter Ansichts-Controller gegen einen anderen ausgetauscht - und somit funktioniert die Übergangsanimation.

Mit anderen Worten, Sie fügen Ihrer View Controller-Hierarchie ganz oben in der Hierarchie einen View Controller hinzu, und das gesamte Problem wird ordnungsgemäß und korrekt gelöst.

8
matt

Versuche dies:

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

Eine alternative Lösung:

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

Swift 4

Funktion in AppDelegate einfügen:

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