簡體   English   中英

UINavigationControllerDelegate不起作用

[英]UINavigationControllerDelegate doesn't work

已得到答案,請更新至正確版本。

當導航視圖控制器彈出/ push時,我想做淡入/淡出動畫,然后實現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;
    }
}

FadeInAnimatorFadeOutAnimator

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

然后,我添加2個視圖控制器並嵌入導航視圖控制器ViewControllerAViewControllerB

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()

    }
}

在按下按鈕ViewControllerA將創建並跳轉到ViewControllerB ,然后按導航欄項目的“背”上ViewControllerB會回到ViewControllerA

但這是行不通的,當按下按鈕時, ViewControllerA顯示ViewControllerB ,然后再次顯示ViewControllerA

有什么建議嗎? 我的xcode是7.1,可以在iPad Air 2模擬器上運行。

在動畫完成塊的FadeInAnimator中

改變這個

transitionContext.completeTransition(transitionContext.transitionWasCancelled())

transitionContext.completeTransition(!transitionContext.transitionWasCancelled())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM