gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:19:31 26 4
gpt4 key购买 nike

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

我为从“主视图”到“设置 View ”的基本“淡入淡出”转换编写了以下代码(两者都是 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)。您已经在上面的自定义转换类中实现了它(我建议将更通用的类改为您的导航 Controller 委托(delegate),例如包含它的 View Controller 或应用程序委托(delegate)),但是您返回了 self不分青红皂白,表明该导航 Controller 的每个过渡都应使用您的淡入淡出过渡。

相反,查看 from/toViewController 参数来决定是否要在这些特定 View Controller 之间使用自定义转换。如果您想使用默认的动画过渡,只需返回 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.

关于iOS 8.4 + Swift - 来自 UINavigationController 的自定义转换,如何将行为限制为导航堆栈中的一个转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31866683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com