From 6926446c4e15eb7f4513c4c00df9279553b330be Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Sat, 22 Feb 2020 15:21:08 -0500 Subject: [PATCH] Maintain velocity when dismissing sheet --- ...tContainerDismissAnimationController.swift | 19 ++++++++++++++++--- .../SheetContainerViewController.swift | 19 +++++++++++++++++-- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/Sources/SheetController/SheetContainerDismissAnimationController.swift b/Sources/SheetController/SheetContainerDismissAnimationController.swift index 9e036ce..8b359fc 100644 --- a/Sources/SheetController/SheetContainerDismissAnimationController.swift +++ b/Sources/SheetController/SheetContainerDismissAnimationController.swift @@ -32,15 +32,28 @@ class SheetContainerDismissAnimationController: NSObject, UIViewControllerAnimat container.addSubview(fromVC.view) let duration = transitionDuration(using: transitionContext) - UIView.animate(withDuration: duration, animations: { + let animator: UIViewPropertyAnimator + + if let initialVelocity = fromVC.dismissAnimationInitialVelocity { + let vector = CGVector(dx: initialVelocity, dy: 0) + let parameters = UISpringTimingParameters(dampingRatio: 1, initialVelocity: vector) + animator = UIViewPropertyAnimator(duration: duration, timingParameters: parameters) + } else { + animator = UIViewPropertyAnimator(duration: duration, curve: .easeOut) + } + + animator.addAnimations { dimmingView.frame = container.bounds dimmingView.alpha = 0 fromVC.view.transform = CGAffineTransform(translationX: 0, y: fromVC.content.view.bounds.height) - }, completion: { (finished) in + } + animator.addCompletion { (position) in dimmingView.removeFromSuperview() transitionContext.completeTransition(!transitionContext.transitionWasCancelled) - }) + } + + animator.startAnimation() } } diff --git a/Sources/SheetController/SheetContainerViewController.swift b/Sources/SheetController/SheetContainerViewController.swift index f118896..242f196 100644 --- a/Sources/SheetController/SheetContainerViewController.swift +++ b/Sources/SheetController/SheetContainerViewController.swift @@ -59,6 +59,9 @@ open class SheetContainerViewController: UIViewController { var initialScrollViewContentOffset: CGPoint? var scrollViewIsMovingSheet = false + public var dismissAtBottomDetent = true + var dismissAnimationInitialVelocity: CGFloat? + public init(content: UIViewController) { self.content = content @@ -204,10 +207,22 @@ open class SheetContainerViewController: UIViewController { return } + let springVelocity: CGFloat + let springDistance = abs(topConstraint.constant - springToDetent.1) + if springDistance != 0 { + springVelocity = velocity / springDistance + } else { + springVelocity = 0 + } + + if dismissAtBottomDetent, springToDetent.0 == .bottom { + dismissAnimationInitialVelocity = springVelocity + dismiss(animated: true) + return + } + if delegate?.sheetContainer(self, willSnapToDetent: springToDetent.0) ?? true { - let springDistance = abs(topConstraint.constant - springToDetent.1) self.topConstraint.constant = springToDetent.1 - let springVelocity = velocity / springDistance UIView.animate(withDuration: 0.35, delay: 0, usingSpringWithDamping: 0.75, initialSpringVelocity: springVelocity, animations: { self.view.layoutIfNeeded()