自定义UINavigationController Segue Swift

自定义UINavigationController Segue Swift,swift,uinavigationcontroller,segue,Swift,Uinavigationcontroller,Segue,在Swift中有一个很棒的自定义动画片段教程: 我是一个初学者,不知道如何使用同样的技术为UINavigationController创建自定义segue VC代码: class FlashCardView: UIViewController, UINavigationControllerDelegate { let transitionManager = TransitionManager() override func prepareForSegue(segue: U

在Swift中有一个很棒的自定义动画片段教程:

我是一个初学者,不知道如何使用同样的技术为UINavigationController创建自定义segue

VC代码:

class FlashCardView: UIViewController, UINavigationControllerDelegate  {

    let transitionManager = TransitionManager()

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        let toViewController = segue.destinationViewController as UIViewController

        toViewController.transitioningDelegate = self.transitionManager
    }
    /* ... */
}
TransitionManager类代码:

import UIKit

class TransitionManager: NSObject, UIViewControllerAnimatedTransitioning, UIViewControllerTransitioningDelegate {

    private var presenting = true

    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
        println("test1")

        let container = transitionContext.containerView()
        let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)!
        let toView = transitionContext.viewForKey(UITransitionContextToViewKey)!


        let offScreenRight = CGAffineTransformMakeTranslation(container.frame.width, 0)
        let offScreenLeft = CGAffineTransformMakeTranslation(-container.frame.width, 0)

        if (self.presenting){
            toView.transform = offScreenRight
        }
        else {
            toView.transform = offScreenLeft
        }

        container.addSubview(toView)
        container.addSubview(fromView)

        let duration = self.transitionDuration(transitionContext)

        UIView.animateWithDuration(duration, delay: 0.0, usingSpringWithDamping: 5, initialSpringVelocity: 0.8, options: nil, animations: {

            if (self.presenting){
                fromView.transform = offScreenLeft
            }
            else {
                fromView.transform = offScreenRight
            }
            toView.transform = CGAffineTransformIdentity

            }, completion: { finished in
                                transitionContext.completeTransition(true)
        })

    }

    func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval {
        println("test2")

        return 0.5
    }

    func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        println("test3")
        self.presenting = true
        return self
    }

    func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        println("test4")
        self.presenting = false
        return self
    }
}

幸运的是,我从那个网站学到了过渡,它是一个令人惊叹的博客。 似乎您不希望在过渡结束时出现反弹效果。使用正常的动画宽度

以下是满足您需求的有效解决方案:

class TransitionManager: NSObject, UIViewControllerAnimatedTransitioning, UIViewControllerTransitioningDelegate  {


func animateTransition(transitionContext: UIViewControllerContextTransitioning)
{

    let container = transitionContext.containerView()
    let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)!
    let toView = transitionContext.viewForKey(UITransitionContextToViewKey)!


    let offScreenRight = CGAffineTransformMakeTranslation(container.frame.width, 0)
    let offScreenLeft = CGAffineTransformMakeTranslation(-container.frame.width, 0)



    toView.transform = offScreenRight

    // add the both views to our view controller
    container.addSubview(toView)
    container.addSubview(fromView)

    let duration = self.transitionDuration(transitionContext)
          UIView.animateWithDuration(0.8, delay: 0.0, options: nil, animations: {

        fromView.transform = offScreenLeft
        toView.transform = CGAffineTransformIdentity

        }, completion: { finished in

            transitionContext.completeTransition(true)

    })
}

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
}
}