Ios 交互式转换:Segue声明
理论问题:在下面的代码中,为什么在“performsgue…”行中,segue没有完全执行?我的意思是,它如何知道这是一个交互转换,为什么“performSegue…”方法的效果与在其他地方声明的效果不同 FirstViewController.swift 故事板 该段从第一个ViewController到第二个ViewControllerIos 交互式转换:Segue声明,ios,swift,segue,interactive,transitions,Ios,Swift,Segue,Interactive,Transitions,理论问题:在下面的代码中,为什么在“performsgue…”行中,segue没有完全执行?我的意思是,它如何知道这是一个交互转换,为什么“performSegue…”方法的效果与在其他地方声明的效果不同 FirstViewController.swift 故事板 该段从第一个ViewController到第二个ViewController 标识符:“segueIdentifier” 赛格:莫代尔 目的地:当前 转换管理器 事实上,我有很多类似的代码,这一个正在工作,但其他非常类似的代码正是
- 标识符:“segueIdentifier”
- 赛格:莫代尔
- 目的地:当前
感谢您的帮助如果问题是您的交互式过渡动画不是交互式的,我建议在
interactionControllerForPresentation
中设置断点:
- 确保调用的
实例正确无误 例如,确保目标的interactionControllerForPresentation
没有替换您在源控制器的viewdiload
中小心设置的prepareforsgue
。。。这很容易做到,如果从A到B再从B到C进行交互转换,那么您预期从B到C的设置可能会干扰您打算从A到B的操作transitioningDelegate
- 确保
返回您认为应该返回的值(即确保interactionControllerForPresentation
肯定是interactive
)真的
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
}
}