模态呈现时的交互式转换

时间:2015-10-30 19:49:57

标签: ios swift

我想在我的应用中使用交互式过渡。我有两个视图控制器。当用户触摸第一个视图控制器中的按钮时,我将以模态方式呈现第二个视图控制器。我的自定义动画运行良好,但交互式转换不起作用。我在屏幕的左边缘添加了一个手势,当我从左边缘平移时,第二个视图控制器正在呈现但不是交互式,它的工作方式与触摸按钮进行呈现相同。

我的课程:

class MenuTransitionManager: UIPercentDrivenInteractiveTransition, UIViewControllerAnimatedTransitioning   {

    private var interactive = false

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

    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {

        let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!
        let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
        let finalFrameForVC = transitionContext.finalFrameForViewController(toViewController)
        let containerView = transitionContext.containerView()
        let bounds = UIScreen.mainScreen().bounds
        toViewController.view.frame = CGRectOffset(finalFrameForVC, 0, bounds.size.height)
        containerView!.addSubview(toViewController.view)

        UIView.animateWithDuration(transitionDuration(transitionContext), delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.0, options: .CurveLinear, animations: {
            fromViewController.view.alpha = 0.5
            toViewController.view.frame = finalFrameForVC
            }, completion: {
                finished in
                transitionContext.completeTransition(true)
                fromViewController.view.alpha = 1.0
        })
    }


    func interactionControllerForPresentation(animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
        // if our interactive flag is true, return the transition manager object
        // otherwise return nil
        return self.interactive ? self : nil
    }

    func interactionControllerForDismissal(animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
        return self.interactive ? self : nil
    }

    private var enterPanGesture: UIScreenEdgePanGestureRecognizer!

    var sourceViewController: UIViewController! {
        didSet {
            self.enterPanGesture = UIScreenEdgePanGestureRecognizer()
            self.enterPanGesture.addTarget(self, action:"handleOnstagePan:")
            self.enterPanGesture.edges = UIRectEdge.Left
            self.sourceViewController.view.addGestureRecognizer(self.enterPanGesture)
        }
    }


    func handleOnstagePan(pan: UIPanGestureRecognizer){

        // how much distance have we panned in reference to the parent view?
        let translation = pan.translationInView(pan.view!)

        // do some math to translate this to a percentage based value
        let d =  translation.x / CGRectGetWidth(pan.view!.bounds) * 0.5

        // now lets deal with different states that the gesture recognizer sends
        switch (pan.state) {

        case UIGestureRecognizerState.Began:
            // set our interactive flag to true
            self.interactive = true

            // trigger the start of the transition
            self.sourceViewController.performSegueWithIdentifier("showAction", sender: self)
            break

        case UIGestureRecognizerState.Changed:

            // update progress of the transition
            self.updateInteractiveTransition(d)
            break

        default: // .Ended, .Cancelled, .Failed ...

            // return flag to false and finish the transition
            self.interactive = false
            self.finishInteractiveTransition()
        }
    }
}

我的第一个视图控制器:

    override func viewDidLoad() {
        super.viewDidLoad()
        self.transitionManager.sourceViewController = self
    }
    var transitionManager = MenuTransitionManager()

    func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return transitionManager
    }

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

        if segue.identifier == "showAction" {
            let toViewController = segue.destinationViewController as UIViewController
            toViewController.transitioningDelegate = self
            toViewController.modalPresentationStyle = .Custom
        }
    }

我该如何解决?

1 个答案:

答案 0 :(得分:0)

您还需要在视图控制器上实现interactionControllerForPresentation(_:)并销售UIViewControllerInteractiveTransitioning的实例(这是UIPercentDrivenInteractiveTransition类已经实现的MenuTransitionManager的子协议)。

documentation around this subject实际上相当不错。