UIPercentDrivenInteractiveTransition Отмена проблемы
Что я имею
я использую UIViewControllerAnimatedTransitioning
protocol
с прикрепленным 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
случай обработчика панорамирования.