Ios 如何进行可弹出或推送的交互式UINavigationController转换?推送动画正在翻转?

Ios 如何进行可弹出或推送的交互式UINavigationController转换?推送动画正在翻转?,ios,cocoa-touch,uiviewcontroller,uinavigationcontroller,Ios,Cocoa Touch,Uiviewcontroller,Uinavigationcontroller,我想有一个奇怪的UINavigationController概念,你可以通过向后平移将视图控制器从堆栈中弹出(就像iOS 7弹出手势),但它会记住弹出的视图控制器,允许你通过向另一个方向平移来“取消映射”(将其推回到堆栈上)。想象一下Safari中的前进和后退按钮,如果你后退,你仍然可以前进,如果你想把页面带回来 我已将UINavigationController子类化,并将自己设置为代理,返回一个UIViewControllerAnimatedTransitioning对象和一个uiperce

我想有一个奇怪的
UINavigationController
概念,你可以通过向后平移将视图控制器从堆栈中弹出(就像iOS 7弹出手势),但它会记住弹出的视图控制器,允许你通过向另一个方向平移来“取消映射”(将其推回到堆栈上)。想象一下Safari中的前进和后退按钮,如果你后退,你仍然可以前进,如果你想把页面带回来

我已将
UINavigationController
子类化,并将自己设置为代理,返回一个
UIViewControllerAnimatedTransitioning
对象和一个
uipercentdriventeractivetransition
对象:

func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    if operation == .Push {
        return Animator(presenting: true)
    } else if operation == .Pop {
        return Animator(presenting: false)
    } else {
        return nil
    }
}

根据动画师是否设置为显示,我调用特定的方法,这适用于显示是否为真:

func presentWithTransitionContext(transitionContext: UIViewControllerContextTransitioning) {
    let toViewControllerView = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!.view
    let containerView = transitionContext.containerView()

    containerView.addSubview(toViewControllerView)
    toViewControllerView.transform = CGAffineTransformMakeTranslation(containerView.bounds.width, 0.0)
    applyShadowToView(toViewControllerView)

    let animationCurve: UIViewAnimationOptions = transitionContext.isInteractive() ? .CurveLinear : .CurveEaseInOut

    UIView.animateWithDuration(transitionDuration(transitionContext), delay: 0.0, options: animationCurve, animations: {
        toViewControllerView.transform = CGAffineTransformIdentity
    }, completion: { finished in
        return transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
    })
}
我覆盖
popViewControllerAnimated
,以便保存正在弹出的视图控制器:

override func popViewControllerAnimated(animated: Bool) -> UIViewController? {
    poppedViewControllers.insert(visibleViewController!, atIndex: 0)
    return super.popViewControllerAnimated(animated)
}
我在
UINavigationController
子类“
awakeFromNib()
中添加了一个
uipangestureerecognizer
,它调用此方法来推送/弹出:

func panned(panGestureRecognizer: UIPanGestureRecognizer) {
    let panningRight = panGestureRecognizer.translationInView(view).x > 0
    let progress: CGFloat

    if panningRight {
        progress = panGestureRecognizer.translationInView(view).x / view.bounds.width
    } else {
        progress = -panGestureRecognizer.translationInView(view).x / view.bounds.width
    }

    if panGestureRecognizer.state == .Began {
        interactiveTransition = UIPercentDrivenInteractiveTransition()

        if panningRight {
            popViewControllerAnimated(true)
        } else {
            let viewControllerToPush = poppedViewControllers[0]
            poppedViewControllers.removeAtIndex(0)
            pushViewController(viewControllerToPush, animated: true)
        }
    } else if panGestureRecognizer.state == .Changed {
        interactiveTransition!.updateInteractiveTransition(progress)
    } else if panGestureRecognizer.state == .Ended {
        if progress > 0.5 {
            interactiveTransition!.finishInteractiveTransition()
        } else {
            interactiveTransition!.cancelInteractiveTransition()
        }

        interactiveTransition = nil
    } else if panGestureRecognizer.state == .Cancelled {
        interactiveTransition!.cancelInteractiveTransition()
        interactiveTransition = nil
    }
}
但是,每当我用手势将以前弹出的视图控制器推到导航堆栈上时,它会以相反的方式设置演示文稿的动画(正在演示的视图控制器立即显示,当前视图控制器滑开)。我不知道为什么会这样。不可能两个都做吗?我是否在应该删除视图时不删除视图

func panned(panGestureRecognizer: UIPanGestureRecognizer) {
    let panningRight = panGestureRecognizer.translationInView(view).x > 0
    let progress: CGFloat

    if panningRight {
        progress = panGestureRecognizer.translationInView(view).x / view.bounds.width
    } else {
        progress = -panGestureRecognizer.translationInView(view).x / view.bounds.width
    }

    if panGestureRecognizer.state == .Began {
        interactiveTransition = UIPercentDrivenInteractiveTransition()

        if panningRight {
            popViewControllerAnimated(true)
        } else {
            let viewControllerToPush = poppedViewControllers[0]
            poppedViewControllers.removeAtIndex(0)
            pushViewController(viewControllerToPush, animated: true)
        }
    } else if panGestureRecognizer.state == .Changed {
        interactiveTransition!.updateInteractiveTransition(progress)
    } else if panGestureRecognizer.state == .Ended {
        if progress > 0.5 {
            interactiveTransition!.finishInteractiveTransition()
        } else {
            interactiveTransition!.cancelInteractiveTransition()
        }

        interactiveTransition = nil
    } else if panGestureRecognizer.state == .Cancelled {
        interactiveTransition!.cancelInteractiveTransition()
        interactiveTransition = nil
    }
}