我正在设置自定义转换动画。一切正常,除了动画结尾的错误:
如您所见,在交互式动画之后,动画再次出现。
这是我用来处理类中符合UIPercentDrivenInteractiveTransition
和UIViewControllerAnimatedTransitioning
的交互式手势的方法:
func handlePan(recognizer: UIPanGestureRecognizer) {
let maxMov:CGFloat = -300
let translation = recognizer.translationInView(recognizer.view!.superview!)
if(translation.y < 0){
let value = (translation.y < maxMov) ? maxMov : translation.y
let progress = value / maxMov
switch recognizer.state {
case .Changed:
updateInteractiveTransition(progress)
case .Cancelled, .Ended:
if progress < 0.5 {
self.cancelInteractiveTransition()
} else {
self.finishInteractiveTransition()
}
default:
break
}
}
}
答案 0 :(得分:0)
自定义转换动画基于CAAnimation,其时间由CAMediaTiming
控制。在handlePan方法中,您应该在转换中重置容器视图的currentTiming。
首先,定义一个存储的上下文,稍后将在animateTransition
方法中分配。
var storedContext: UIViewControllerContextTransitioning?
然后进入:
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
storedContext = transitionContext
....}
然后在你的handlePan中:
case .Cancelled, .Ended:
let transitionLayer = storedContext!.containerView().layer
transitionLayer.beginTime = CACurrentMediaTime()
....
这可确保containerLayer的开始时间等于您取消或结束手势的时间!如果没有这个过程,就会发生重复的动画。