web-dev-qa-db-ja.com

rootViewControllerをアニメーションと交換しますか?

Tabバーで別のルートビューコントローラーにスワップしようとしています。アプリデリゲート経由で、トランジションアニメーションを追加したいです。デフォルトでは、アニメーションなしでのみビューを表示します。

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

それが私が別のルートビューコントローラーに交換した方法です。

46
Chris Mikkelsen

私はUIView.transition(from: view, to: view)UIView.transition(with: view)を少し前に評価し、これを使用することになりました:(しかし、残念ながらその理由を思い出せません)

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

これを試して:

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

別のルートビューコントローラーに交換しようとしています...そして、トランジションアニメーションを追加したいです

私はこれを行うアプリを持っています:それはアニメーションでルートビューコントローラーを変更します(Albumenと呼ばれます)。

しかし、私のアプリは実際にdoes n'tは実際にルートView Controllerを変更します。ルートView Controllerは、変更されないカスタムコンテナView Controllerです。そのビューは表示されず、機能もありません。その唯一の仕事は、変更が発生する場所になることです。1つの子View Controllerを別のView Controllerと交換します。したがって、トランジションアニメーションが機能します。

つまり、View Controllerの階層の最上部にView Controllerの階層を1つ追加すると、問題全体がきれいに正しく解決されます。

8
matt

Swift 4

関数を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)
}
4
Wiingaard

代替ソリューション:

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 = rootVC;
UIView.transition(with: snapshot, duration: 0.4, options: .transitionCrossDissolve, animations: {
    snapshot.layer.opacity = 0;
}, completion: { (status) in
    snapshot.removeFromSuperview()
})
4