【发布时间】:2019-02-16 20:58:31
【问题描述】:
我在我的代码中使用协调器模式从 RootNavigationController 转换到 SplashScreenViewController
class AppCoordinator {
let window: UIWindow
let rootViewController: RootNavigationController
init(window: UIWindow) {
self.window = window
rootViewController = RootNavigationController()
let splashScreenViewController = SplashScreenViewController()
rootViewController.pushViewController(splashScreenViewController, animated: false)
}
}
extension AppCoordinator: Coordinator {
func start() {
window.rootViewController = rootViewController
window.makeKeyAndVisible()
}
}
我还使用自定义转换来处理从 RootNavigationController 到 SplashScreenNavigationController 的转换。
class FadeInAnimator: NSObject {
var duration: TimeInterval = 1.0
}
extension FadeInAnimator: UIViewControllerAnimatedTransitioning {
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return duration
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
let containerView = transitionContext.containerView
guard let toViewController = transitionContext.viewController(forKey: .to) else { return }
containerView.addSubview(toViewController.view)
toViewController.view.alpha = 0
let durationOfTransition = transitionDuration(using: transitionContext)
UIView.animate(withDuration: durationOfTransition, delay: 0, options: [.curveEaseIn], animations: {
toViewController.view.alpha = 1
}) { (finished) in
transitionContext.completeTransition(finished)
}
}
}
我已经将 RootNavigationController 的委托设置为它自己并实现了动画转换,但是,当我启动应用程序时,它似乎只是忽略了我所做的一切,只使用系统默认转换。
这是RootNavigationController中的代码
class RootNavigationController: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()
delegate = self
navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationBar.shadowImage = UIImage()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
extension RootNavigationController: UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
switch operation {
case .push: return FadeInAnimator()
case .pop: return nil
case .none: return nil
}
}
}
【问题讨论】:
-
UIViewControllerAnimatedTransitioning 用于动画modally呈现的视图控制器的过渡。您是以模态方式展示您的
SplashScreenViewController,还是通过pushViewController(_:animated:)将其推送到导航控制器堆栈?如果您不确定,请分享您的RootNavigationController中的相关代码。 -
它正在从导航堆栈中推送,如“AppCoordinator”类中所示
-
抱歉,错过了 - 你能分享你的 RootNavigationController 代码吗?具体来说,您对 navigationController(_:animationControllerFor:from:to) 的实现
-
我已经编辑显示 RootNavigationController 中的代码
-
在窗口上调用 makeKeyAndVisible() 之后,尝试将 pushViewController(_:animated:) 的调用移出 AppCoordinator 初始化程序,并将其移到 start() 方法的末尾.只是一个理论(如果不亲自调试应用程序就很难确定) - 如果它有效,请告诉我,我会写一个答案来解释出了什么问题。
标签: swift uinavigationcontroller coordinator-pattern