UIPercentDrivenInteractiveTransition Canceling Issue

Lo que tengo

Estoy usando el protocol UIViewControllerAnimatedTransitioning con un UIViewPropertyAnimator adjunto para desplazarse hacia abajo para descartar un controller de vista

 extension SecondViewController : UIViewControllerAnimatedTransitioning { func interruptibleAnimator(using ctx: UIViewControllerContextTransitioning) -> UIViewImplicitlyAnimating { if self.animator != nil { return self.animator! } let containerView = ctx.containerView let toVC = ctx.viewController(forKey: .to) as! FirstViewController let fromVC = ctx.viewController(forKey: .from) as! SecondViewController containerView.insertSubview(toVC.view, belowSubview: fromVC.view) self.animator = UIViewPropertyAnimator(duration: transitionDuration(using: ctx), curve: .easeOut, animations: { self.fromVC.view.transform = CGAffineTransform(scale: 0.5) }) self.animator.isInterruptible = true self.animator.isUserInteractionEnabled = true self.animator.isManualHitTestingEnabled = true self.animator.addCompletion { position in switch position { case .end: break case .current: break case .start: break } let cancelled = ctx.transitionWasCancelled if (cancelled) { //.. } else { //.. } ctx.completeTransition(!cancelled) } self.animator = anim return self.animator } func transitionDuration(using ctx: UIViewControllerContextTransitioning?) -> TimeInterval { return 0.5 } func animateTransition(using ctx: UIViewControllerContextTransitioning) { let animator = self.interruptibleAnimator(using: ctx) self.animator.startAnimation() } func animationEnded(_ transitionCompleted: Bool) { self.interactiveTransition = nil self.animator = nil } } 

Pan Gesture para manejar la animation:

 func handlePanGesture(gestureRecognizer: UIPanGestureRecognizer) { let panTranslation = gestureRecognizer.translation(in: gestureRecognizer.view!) var progress = panTranslation.y / (gestureRecognizer.view!.bounds.size.height * 0.5) switch gestureRecognizer.state { case .began: self.interactiveTransition = UIPercentDrivenInteractiveTransition() self.navigationController!.popViewController(animated: true) case .changed: self.interactiveTransition!.update(progress) case .cancelled, .ended: if progress > 0.5 { //Complete Transition let timingParameters = UICubicTimingParameters(animationCurve: .easeInOut) self.animator!.continueAnimation!(withTimingParameters: timingParameters, durationFactor: progress) self.animator?.addAnimations! { //Completion Animations } self.interactiveTransition!.finish() } else { //Cancel Transition self.animator!.isReversed = true let timingParameters = UICubicTimingParameters(animationCurve: .easeInOut) self.animator!.continueAnimation!(withTimingParameters: timingParameters, durationFactor: progress) self.animator!.addAnimations!({ //Cancelling Animations }, delayFactor: 0 ) self.interactiveTransition!.cancel() } default: break } } 

Que funciona

Bajando hasta el despido funciona perfectamente. Bajando ligeramente hacia abajo y levantando el dedo para cancelar también funciona perfectamente.

Problema

Bajando y retrocediendo más allá del punto de inicio (donde el progreso se vuelve negativo) y levantando el dedo debería cancelar la transición con la cancelación de la animation. Esto sucede en iOS 10, pero primero invierte primero las transiciones del controller de navigation y luego vuelve a encajar. En iOS 11, la cancelación de la animation ocurre, luego veo que la transición del controller de navigation se invierte. Si espera, puede ver la transición del controller de navigation si intenta corregirla en animation durante más de 10 minutos.

Problema con:

  - self.interactiveTransition!.cancel()? - self.interactiveTransition!.completionSpeed ??