【问题标题】:Interactive Transition : Segue declaration交互式过渡:Segue 声明
【发布时间】:2023-03-10 23:58:01
【问题描述】:

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

  • 标识符:“segueIdentifier”

  • 转场:模态

  • 目的地:当前

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】:

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

  • 确保interactionControllerForPresentation 的正确实例以您认为应该的方式调用。

    例如,确保目标的viewDidLoad 没有替换您在源控制器中仔细设置的prepareForSegue 中的transitioningDelegate ...如果从A 进行交互式转换,这很容易做到到 B,然后再从 B 到 C,您在 B 到 C 的预期中设置的内容可能会干扰您打算从 A 到 B 执行的操作。

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

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

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

【讨论】:

  • 感谢您的帮助,问题是我在使用交互式过渡时并不真正了解自己在做什么。我试图把 prinln() 放在任何地方,我不明白的是年表:什么时候调用了哪个函数?实际上,使用 println() 时,问题在于 self.interactive 在这里不正确,但在 prepareForSegue 函数之前它是正确的,并且在之后的gestureHandler 函数中它是正确的。仅对于功能来说是错误的...您似乎对交互式过渡了解很多,您知道教程或可以很好地解释它是如何工作的东西吗?谢谢
  • 在良好的演示方面,我使用了 WWDC 视频和少量实验。我确信那里有很好的演示,但我只是没有一个可以推荐。但是谷歌搜索“iOS 自定义转换教程”给了我很多有希望的结果。至于为什么interactive 不正确,我可能猜想虽然源正在实例化TransitionManager,但目标视图控制器的viewDidLoad 可能正在实例化另一个?我不知道。很难说没有看到更多的代码。就个人而言,我可能更喜欢看到目标拥有这个对象而不是源控制器。
  • 我终于解决了这个问题,别问我怎么...谢谢你的帮助,我去搜索WWDC的视频。
猜你喜欢
  • 2016-06-01
  • 2019-04-01
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
相关资源
最近更新 更多