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