自定义UINavigationController Segue Swift

时间:2014-09-20 01:59:55

标签: swift uinavigationcontroller segue

这里有一个关于Swift定制动画片段的精彩教程:

http://mathewsanders.com/animated-transitions-in-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
    }
}

1 个答案:

答案 0 :(得分:0)

幸运的是,我从该网站学到了过渡,这是一个了不起的博客。 看起来你不希望弹跳效应成为过渡的结束。使用正常的animatewithduration。

以下是满足您需求的可行解决方案:

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
}

}