动画以自定义交互式过渡动画错误结束?
Animation ends with error in custom interactive transitioning animation?
我正在设置自定义过渡动画。一切正常,除了动画结束时的错误:
如你所见,在交互动画之后,动画再次执行。
这是我用来处理 class 中的交互手势的方法,符合 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
}
}
}
自定义过渡动画基于CAAnimation,其时间由CAMediaTiming
控制。在handlePan方法中,需要在transitioning中重新设置container view的currentTiming。
首先,定义一个存储上下文,稍后将在 animateTransition
方法中分配。
var storedContext: UIViewControllerContextTransitioning?
然后获取它:
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
storedContext = transitionContext
....}
然后在你的 handlePan:
case .Cancelled, .Ended:
let transitionLayer = storedContext!.containerView().layer
transitionLayer.beginTime = CACurrentMediaTime()
....
这可确保 containerLayer 的开始时间等于您取消或结束手势的时间!如果没有这个过程,就会出现重复的动画。
我正在设置自定义过渡动画。一切正常,除了动画结束时的错误:
如你所见,在交互动画之后,动画再次执行。
这是我用来处理 class 中的交互手势的方法,符合 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
}
}
}
自定义过渡动画基于CAAnimation,其时间由CAMediaTiming
控制。在handlePan方法中,需要在transitioning中重新设置container view的currentTiming。
首先,定义一个存储上下文,稍后将在 animateTransition
方法中分配。
var storedContext: UIViewControllerContextTransitioning?
然后获取它:
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
storedContext = transitionContext
....}
然后在你的 handlePan:
case .Cancelled, .Ended:
let transitionLayer = storedContext!.containerView().layer
transitionLayer.beginTime = CACurrentMediaTime()
....
这可确保 containerLayer 的开始时间等于您取消或结束手势的时间!如果没有这个过程,就会出现重复的动画。