ios - 交互式过渡 : Segue declaration

标签 ios swift segue interactive transitions

理论问题:在下面的代码中,为什么在“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

}

Storyboard

转场是从 FirstViewController 到 SecondViewController。

  • 标识符:“segueIdentifier”

  • Segue : 模态

  • 目的地:当前

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 只是在没有交互转换的情况下执行。谁能给我解释一下?

谢谢你的帮助

最佳答案

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

  • 确保 interactionControllerForPresentation 的正确实例就像您认为的那样被调用。

    例如,确保 viewDidLoad目的地没有取代 transitioningDelegate你如此仔细地设置在 prepareForSegue在源 Controller 中...如果进行从 A 到 B 然后再从 B 到 C 的交互式转换,这很容易做到,你在 B 到 C 的预期中设置的内容可能会干扰你打算从 A 到 B 的操作.

  • 确保interactionControllerForPresentation正在返回您认为应该返回的值(即确保 interactive 绝对是 true )。

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

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

关于ios - 交互式过渡 : Segue declaration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26576447/

相关文章:

ios - 使不可见的 View Controller 的布局无效

ios - 核心数据替代方案

ios - 如何在 iOS 中将数据发送到蓝牙 LE

ios - 尝试在 UIViewController 被关闭后再次呈现它

swift - Swift音频传递给另一个ViewController

ios - 自定义绘制时何时更改 UIView 的框架大小?

iphone - 当应用程序进入 bkgr 时 uialertview 会发生什么

ios - 如何显示读取 "Today, 14 April"的日期?

ios - 带有 "where"的协议(protocol)导致崩溃

ios - 快速控制流程