Cindy
Cindy

Reputation: 273

UINavigationControllerDelegate doesn't work

Update to correct version, since have got the answer.

I want to do fade in/fade out animation when navigation view controller pop up /push, then I implement a BaseViewController:

class BaseViewController: UIViewController, UINavigationControllerDelegate {

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.delegate = self
    }


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

        if (operation == UINavigationControllerOperation.Push) {
            return FadeInAnimator()
        }

        if (operation == UINavigationControllerOperation.Pop) {
            return FadeOutAnimator()
        }
        return nil;
    }
}

and FadeInAnimator, FadeOutAnimator:

class FadeInAnimator: NSObject, UIViewControllerAnimatedTransitioning {

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

    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {

        let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
        transitionContext.containerView()?.addSubview(toViewController!.view)
        toViewController?.view.alpha = 0.0
        UIView.animateWithDuration(self.transitionDuration(transitionContext), animations: { () -> Void in
            toViewController?.view.alpha = 1.0
        }) { (finished) -> Void in
            transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
        }
    }
}

class FadeOutAnimator: NSObject, UIViewControllerAnimatedTransitioning {
    func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
        return 0.5
    }

    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
        let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
        let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)
        transitionContext.containerView()?.insertSubview((toViewController?.view)!, belowSubview: (fromViewController?.view)!)

        UIView.animateWithDuration(self.transitionDuration(transitionContext), animations: { () -> Void in
            fromViewController?.view.alpha = 0.0
        }) { (finished) -> Void in
            transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
    }
}

Then, I add 2 view controllers and embed navigation view controller, ViewControllerA and ViewControllerB:

class ViewControllerA: BaseViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func pressButton(sender: UIButton) {

        if let vc = create(ViewControllerB) {
            self.navigationController?.pushViewController(vc, animated: true)
        }
    }  
}

class ViewControllerB: BaseViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

    }
}

press button on ViewControllerA will create and jump to ViewControllerB, then press navigation bar item "back" on ViewControllerB will back to ViewControllerA.

But it doesn't work, when press button, the ViewControllerA show ViewControllerB, then show ViewControllerA again.

any suggestion? my xcode is 7.1 and run on iPad Air 2 simulator.

Upvotes: 0

Views: 348

Answers (1)

Ashish P.
Ashish P.

Reputation: 858

in your FadeInAnimator at animation completion block

change this

transitionContext.completeTransition(transitionContext.transitionWasCancelled())

to

transitionContext.completeTransition(!transitionContext.transitionWasCancelled())

Upvotes: 1

Related Questions