Gallery dismiss interaction fixes

This commit is contained in:
Shadowfacts 2024-11-25 18:38:07 -05:00
parent 56d12295ba
commit fa828a5eae
1 changed files with 15 additions and 4 deletions

View File

@ -20,6 +20,8 @@ class GalleryDismissInteraction: NSObject {
private(set) var dismissVelocity: CGPoint? private(set) var dismissVelocity: CGPoint?
private(set) var dismissTranslation: CGPoint? private(set) var dismissTranslation: CGPoint?
private var cancelAnimator: UIViewPropertyAnimator?
init(viewController: GalleryViewController) { init(viewController: GalleryViewController) {
self.viewController = viewController self.viewController = viewController
super.init() super.init()
@ -38,6 +40,8 @@ class GalleryDismissInteraction: NSObject {
content = viewController.currentItemViewController.takeContent() content = viewController.currentItemViewController.takeContent()
content!.view.translatesAutoresizingMaskIntoConstraints = true content!.view.translatesAutoresizingMaskIntoConstraints = true
content!.view.frame = origContentFrameInGallery! content!.view.frame = origContentFrameInGallery!
// Make sure the context remains behind the controls
content!.view.layer.zPosition = -1000
viewController.view.addSubview(content!.view) viewController.view.addSubview(content!.view)
origControlsVisible = viewController.currentItemViewController.controlsVisible origControlsVisible = viewController.currentItemViewController.controlsVisible
@ -59,20 +63,27 @@ class GalleryDismissInteraction: NSObject {
if translationMagnitude < 150 && velocityMagnitude < 500 { if translationMagnitude < 150 && velocityMagnitude < 500 {
isActive = false isActive = false
cancelAnimator?.stopAnimation(true)
let spring = UISpringTimingParameters(mass: 1, stiffness: 439, damping: 42, initialVelocity: .zero) let spring = UISpringTimingParameters(mass: 1, stiffness: 439, damping: 42, initialVelocity: .zero)
let animator = UIViewPropertyAnimator(duration: 0.2, timingParameters: spring) cancelAnimator = UIViewPropertyAnimator(duration: 0.2, timingParameters: spring)
animator.addAnimations { cancelAnimator!.addAnimations {
self.content!.view.frame = self.origContentFrameInGallery! self.content!.view.frame = self.origContentFrameInGallery!
self.viewController.currentItemViewController.setControlsVisible(self.origControlsVisible!, animated: false, dueToUserInteraction: false) self.viewController.currentItemViewController.setControlsVisible(self.origControlsVisible!, animated: false, dueToUserInteraction: false)
} }
animator.addCompletion { _ in cancelAnimator!.addCompletion { _ in
guard !self.isActive else {
// bail in case the animation finishing raced with the user's interaction
return
}
self.content!.view.layer.zPosition = 0
self.content!.view.removeFromSuperview() self.content!.view.removeFromSuperview()
self.viewController.currentItemViewController.addContent() self.viewController.currentItemViewController.addContent()
self.content = nil self.content = nil
self.origContentFrameInGallery = nil self.origContentFrameInGallery = nil
self.origControlsVisible = nil self.origControlsVisible = nil
} }
animator.startAnimation() cancelAnimator!.startAnimation()
} else { } else {
dismissVelocity = velocity dismissVelocity = velocity