iOS 8.4 + Swift - 来自 UINavigationController 的自定义转换,如何将行为限制为导航堆栈中只有一个转换?

iOS 8.4 + Swift - Custom Transitions from UINavigationController, how can I limit the behavior to only one transition in the Navigation Stack?

我最近一直在尝试一些非常基本的自定义过渡,我开始掌握它的窍门了。然而,到目前为止,我只进行了模态转换。

我为从 "Master View" 到 "Settings View" 的基本 "Fade" 转换编写了以下代码(两者都是 NavigationController 堆栈的一部分):

import UIKit
import QuartzCore

///Transition manager for transitioning between the loginVC and the content that follows.
class FadeTransition: NSObject, UIViewControllerAnimatedTransitioning, UIViewControllerTransitioningDelegate, UINavigationControllerDelegate {

    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
        let destinationVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
        let sourceView = transitionContext.viewForKey(UITransitionContextFromViewKey)
        let destinationView = transitionContext.viewForKey(UITransitionContextToViewKey)
        transitionContext.containerView().addSubview(destinationView!)

        UIView.animateWithDuration(self.transitionDuration(transitionContext), animations: { () -> Void in

            sourceView!.alpha = 0.0
            destinationView!.alpha = 1.0
            }) { (didComplete) -> Void in

                println("Fade Transition: \(didComplete)")
                transitionContext.completeTransition(didComplete)
        }
    }

    func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval {
        return 0.5
    }

    func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return self
    }

    func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return self
    }

    func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return self
    }


}

我很兴奋。我很高兴。一切似乎都很好,直到我转到另一个 View Controller,该 View Controller 也有来自 "Master View" 的 segue ...并且它具有相同的转换。当然这是意料之中的事情,我只是没想到。

如何限制此转换仅发生在两个特定 UIViewControllers 之间?

您需要查看 UINavigationControllerDelegate 方法 navigationController(_:animationControllerForOperation:fromViewController:toViewController)。您已经在上面的自定义转换 class 中实现了它(我建议您制作一个更通用的 class 您的导航控制器委托,例如包含它的视图控制器或应用程序委托),但是您 return self 不分青红皂白,表明该导航控制器的每个过渡都应使用您的淡入淡出过渡。

相反,请查看 from/toViewController 参数来决定是否要在这些特定视图控制器之间使用自定义转换。如果你想使用默认的动画过渡,只需 return nil.

来自UINavigationControllerDelegate Protocol Reference

Return Value

The animator object responsible for managing the transition animations, or nil if you want to use the standard navigation controller transitions. The object you return must conform to the UIViewControllerAnimatorTransitioning protocol.