Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 交互式转换:Segue声明_Ios_Swift_Segue_Interactive_Transitions - Fatal编程技术网

Ios 交互式转换:Segue声明

Ios 交互式转换:Segue声明,ios,swift,segue,interactive,transitions,Ios,Swift,Segue,Interactive,Transitions,理论问题:在下面的代码中,为什么在“performsgue…”行中,segue没有完全执行?我的意思是,它如何知道这是一个交互转换,为什么“performSegue…”方法的效果与在其他地方声明的效果不同 FirstViewController.swift 故事板 该段从第一个ViewController到第二个ViewController 标识符:“segueIdentifier” 赛格:莫代尔 目的地:当前 转换管理器 事实上,我有很多类似的代码,这一个正在工作,但其他非常类似的代码正是

理论问题:在下面的代码中,为什么在“performsgue…”行中,segue没有完全执行?我的意思是,它如何知道这是一个交互转换,为什么“performSegue…”方法的效果与在其他地方声明的效果不同

FirstViewController.swift 故事板 该段从第一个ViewController到第二个ViewController

  • 标识符:“segueIdentifier”

  • 赛格:莫代尔

  • 目的地:当前

转换管理器 事实上,我有很多类似的代码,这一个正在工作,但其他非常类似的代码正是我所解释的:segue只是在没有交互转换的情况下执行的。有人能给我解释一下吗


感谢您的帮助

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

  • 确保调用的
    interactionControllerForPresentation
    实例正确无误

    例如,确保目标的
    viewdiload
    没有替换您在源控制器的
    prepareforsgue
    中小心设置的
    transitioningDelegate
    。。。这很容易做到,如果从A到B再从B到C进行交互转换,那么您预期从B到C的设置可能会干扰您打算从A到B的操作

  • 确保
    interactionControllerForPresentation
    返回您认为应该返回的值(即确保
    interactive
    肯定是
    真的

每次我看到一个手势没有像我认为应该的那样以交互方式启动转换,这是因为当在目标控制器的transitioningDelegate中调用
interactionControllerForPresentation
时,它没有像我预期的那样返回有效的
UIViewControllerInteractiveTransitioning
(例如
UIPercentDrivenInteractiveTransition


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

你能准确地澄清问题是什么吗?交互式过渡动画是否不是交互式的?到底出了什么问题?你期望什么?你经历了什么?谢谢你的帮助,问题是我真的不明白在使用交互式转换时我在做什么。我试着把prinln()放在每个地方,但我不明白的是时间顺序:调用哪个函数,何时调用?事实上,对于println(),问题在于self.interactive在这里不是真的,但在prepareforsgue函数之前是真的,在gestureHandler函数之后是真的。就功能而言,这是错误的。。。您似乎对交互式转换非常了解,您是否知道一个教程或其他东西可以很好地解释它是如何工作的?就好的演示而言,我使用了WWDC视频和一些实验。我肯定有很多很好的演示,但我只是没有一个可以推荐。但谷歌搜索“iOS定制过渡教程”给了我很多有希望的点击率。至于为什么
interactive
不正确,我可能会猜测,虽然源代码正在实例化
TransitionManager
,但目标视图控制器的
viewDidLoad
可能正在实例化另一个?我不知道。很难说没有看到更多的代码。就个人而言,我可能更愿意看到目标拥有这个对象,而不是源代码控制器。我终于解决了这个问题,不要问我如何。。。谢谢你的帮助,我将搜索WWDC视频。
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

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





}