动画以自定义交互式过渡动画错误结束?

Animation ends with error in custom interactive transitioning animation?

我正在设置自定义过渡动画。一切正常,除了动画结束时的错误:

如你所见,在交互动画之后,动画再次执行。

这是我用来处理 class 中的交互手势的方法,符合 UIPercentDrivenInteractiveTransitionUIViewControllerAnimatedTransitioning:

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 的开始时间等于您取消或结束手势的时间!如果没有这个过程,就会出现重复的动画。