互动转型:Segue声明

问题描述 投票:3回答:1

理论问题:在下面的代码中,为什么在“performSegue ....”的行中,segue不是完全执行的?我的意思是,它是如何知道它是一个交互式过渡,以及为什么方法“performSegue ...”与她在其他地方被宣布的效果不同?

FirstViewController.swift

let transitionManager = TransitionManager()


override func viewDidLoad() {
    super.viewDidLoad()

    transitionManager.sourceViewController = self

    // Do any additional setup after loading the view.
}

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

    let dest = segue.destinationViewController as UIViewController
    dest.transitioningDelegate = transitionManager
    transitionManager.destViewController = dest

}

故事板

segue是从FirstViewController到SecondViewController。

  • 标识符:“followUdentifier”
  • 以下:莫代尔
  • 目的地:当前

TransitionManager.swift

class TransitionManager: UIPercentDrivenInteractiveTransition,UIViewControllerAnimatedTransitioning, UIViewControllerTransitioningDelegate,UIViewControllerInteractiveTransitioning {

    var interactive = false
    var presenting = false

    var panGesture : UIPanGestureRecognizer!

    var sourceViewController : UIViewController! {
        didSet {

            panGesture = UIPanGestureRecognizer(target: self, action: "gestureHandler:")
            sourceViewController.view.addGestureRecognizer(panGesture)

        }
    }


    func gestureHandler(pan : UIPanGestureRecognizer) {

        let translation = pan.translationInView(pan.view!)

        let d =  translation.x / pan.view!.bounds.width * 0.5        

        switch pan.state {

        case UIGestureRecognizerState.Began :

            interactive = true

            sourceViewController.performSegueWithIdentifier("segueIdentifier", sender: self)


        case UIGestureRecognizerState.Changed :

            self.updateInteractiveTransition(d)

        default :

            interactive = false

            if d > 0.2 || velocity.x > 0 {
                self.finishInteractiveTransition()
            }
            else {
                self.cancelInteractiveTransition()
            }
        }

    }

    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {

        //Something....


        UIView.animateWithDuration(1.0, animations: {

            //Something....

            }, completion: {}

        })

    }

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

    // MARK: UIViewControllerTransitioningDelegate protocol methods

    func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        self.presenting = true
        return self
    }

    func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        self.presenting = false
        return self
    }

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

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





}

事实上,我有很多与此类似的代码,这个代码正在工作,但其他代码非常相似,正是我所解释的:segue只是在没有交互式转换的情况下执行。有人可以解释一下吗?

谢谢你的帮助

ios swift segue interactive transitions
1个回答
2
投票

如果问题是您的交互式过渡动画不是交互式的,我建议在interactionControllerForPresentation中放置一个断点:

  • 确保调用正确的interactionControllerForPresentation实例,就像你认为的那样。 例如,确保目的地的viewDidLoad没有替换您在源控制器中的transitioningDelegate中仔细设置的prepareForSegue ...如果从A到B然后再从B到C进行交互式转换,这很容易做到,你预期B到C的设置会干扰你打算从A到B做什么。
  • 确保interactionControllerForPresentation返回您认为应该的值(即确保interactive绝对是true)。

每当我看到这种手势的行为没有以交互方式启动过渡时,就像我认为的那样,这是因为当interactionControllerForPresentation在目标控制器的transitioningDelegate中被调用时,它没有返回有效的UIViewControllerInteractiveTransitioning(例如UIPercentDrivenInteractiveTransition) )就像我想要的那样。

无论如何,你可以通过在interactionControllerForPresentation中添加一个日志语句来诊断它,你会发现(a)由于某种原因它没有被调用;或(b)self.interactive不是true

© www.soinside.com 2019 - 2024. All rights reserved.