UIPercentDrivenInteractiveTransition Отмена проблемы

Что я имею

я использую UIViewControllerAnimatedTransitioningprotocol с прикрепленным UIViewPropertyAnimator сдвинуть вниз, чтобы отклонить View Controller

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
    }
}

Пан Жест для управления анимацией:

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
    }
}

Что работает

Смахивание вниз до увольнения работает отлично. Слегка проведите вниз и поднимите палец, чтобы отменить, также работает отлично.

вопрос

Проведите вниз и назад за начальную точку (где прогресс становится отрицательным) и поднимите палец вверх, чтобы отменить переход с отменой анимации. Это происходит в iOS 10, но сначала сначала изменяются переходы контроллера навигации, а затем происходит возврат назад. В iOS 11 происходит отмена анимации, затем я вижу, что переход контроллера навигации меняется на противоположный. Если вы подождете, вы увидите, что переход навигационного контроллера пытается исправить его самостоятельно в анимации в течение 10 минут или около того.

Проблема с:

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

1 ответ

AFAIK это UIKit ошибка, требующая взлома 0,999. добавлять .completionSpeed = 0.999 к interactionController в .ended случай обработчика панорамирования.

Другие вопросы по тегам