From 472b9aa5e2e0ac554969eac5cbab6d68b8e35e9e Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Sat, 12 Jun 2021 11:26:44 -0400 Subject: [PATCH] Fixes for large image animations on devices with square screns --- .../Attachment Gallery/GalleryViewController.swift | 8 +++++++- .../Screens/Large Image/LargeImageViewController.swift | 8 +++++++- .../Large Image/LoadingLargeImageViewController.swift | 8 +++++++- .../LargeImageExpandAnimationController.swift | 3 ++- .../Transitions/LargeImageInteractionController.swift | 10 ++++++++-- 5 files changed, 31 insertions(+), 6 deletions(-) diff --git a/Tusker/Screens/Attachment Gallery/GalleryViewController.swift b/Tusker/Screens/Attachment Gallery/GalleryViewController.swift index 02135b81..82672831 100644 --- a/Tusker/Screens/Attachment Gallery/GalleryViewController.swift +++ b/Tusker/Screens/Attachment Gallery/GalleryViewController.swift @@ -51,8 +51,14 @@ class GalleryViewController: UIPageViewController, UIPageViewControllerDataSourc } var dismissInteractionController: LargeImageInteractionController? + var isInteractivelyAnimatingDismissal: Bool = false { + didSet { + setNeedsStatusBarAppearanceUpdate() + } + } + override var prefersStatusBarHidden: Bool { - return true + return !isInteractivelyAnimatingDismissal } override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { return .none diff --git a/Tusker/Screens/Large Image/LargeImageViewController.swift b/Tusker/Screens/Large Image/LargeImageViewController.swift index 0e0530dc..9877aceb 100644 --- a/Tusker/Screens/Large Image/LargeImageViewController.swift +++ b/Tusker/Screens/Large Image/LargeImageViewController.swift @@ -51,8 +51,14 @@ class LargeImageViewController: UIViewController, UIScrollViewDelegate, LargeIma private var prevZoomScale: CGFloat? private var isGrayscale = false + var isInteractivelyAnimatingDismissal: Bool = false { + didSet { + setNeedsStatusBarAppearanceUpdate() + } + } + override var prefersStatusBarHidden: Bool { - return true + return !isInteractivelyAnimatingDismissal } override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { return .none diff --git a/Tusker/Screens/Large Image/LoadingLargeImageViewController.swift b/Tusker/Screens/Large Image/LoadingLargeImageViewController.swift index 8d231212..a958225e 100644 --- a/Tusker/Screens/Large Image/LoadingLargeImageViewController.swift +++ b/Tusker/Screens/Large Image/LoadingLargeImageViewController.swift @@ -43,8 +43,14 @@ class LoadingLargeImageViewController: UIViewController, LargeImageAnimatableVie var animationGifData: Data? { largeImageVC?.animationGifData } var dismissInteractionController: LargeImageInteractionController? + var isInteractivelyAnimatingDismissal: Bool = false { + didSet { + setNeedsStatusBarAppearanceUpdate() + } + } + override var prefersStatusBarHidden: Bool { - return true + return !isInteractivelyAnimatingDismissal } override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { return .none diff --git a/Tusker/Screens/Large Image/Transitions/LargeImageExpandAnimationController.swift b/Tusker/Screens/Large Image/Transitions/LargeImageExpandAnimationController.swift index 0e025449..cf364e3d 100644 --- a/Tusker/Screens/Large Image/Transitions/LargeImageExpandAnimationController.swift +++ b/Tusker/Screens/Large Image/Transitions/LargeImageExpandAnimationController.swift @@ -15,6 +15,7 @@ protocol LargeImageAnimatableViewController: UIViewController { var animationImage: UIImage? { get } var animationGifData: Data? { get } var dismissInteractionController: LargeImageInteractionController? { get } + var isInteractivelyAnimatingDismissal: Bool { get set } } extension LargeImageAnimatableViewController { @@ -74,7 +75,7 @@ class LargeImageExpandAnimationController: NSObject, UIViewControllerAnimatedTra toVC.largeImageController?.contentView.isHidden = true toVC.largeImageController?.setControlsVisible(false, animated: false) - var finalFrameSize = finalVCFrame.inset(by: fromVC.view.safeAreaInsets).size + var finalFrameSize = finalVCFrame.inset(by: toVC.view.safeAreaInsets).size let newWidth = finalFrameSize.width / image.size.width let newHeight = finalFrameSize.height / image.size.height if newHeight < newWidth { diff --git a/Tusker/Screens/Large Image/Transitions/LargeImageInteractionController.swift b/Tusker/Screens/Large Image/Transitions/LargeImageInteractionController.swift index f8fa2e25..340467a0 100644 --- a/Tusker/Screens/Large Image/Transitions/LargeImageInteractionController.swift +++ b/Tusker/Screens/Large Image/Transitions/LargeImageInteractionController.swift @@ -14,9 +14,9 @@ class LargeImageInteractionController: UIPercentDrivenInteractiveTransition { var direction: CGFloat? var shouldCompleteTransition = false - private weak var viewController: UIViewController! + private weak var viewController: LargeImageAnimatableViewController! - init(viewController: UIViewController) { + init(viewController: LargeImageAnimatableViewController) { super.init() self.viewController = viewController let panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handleGesture(_:))) @@ -42,6 +42,7 @@ class LargeImageInteractionController: UIPercentDrivenInteractiveTransition { viewController.dismiss(animated: true) case .changed: shouldCompleteTransition = progress > 0.5 || velocity > 1000 + viewController.isInteractivelyAnimatingDismissal = progress > 0.1 update(progress) case .cancelled: inProgress = false @@ -59,4 +60,9 @@ class LargeImageInteractionController: UIPercentDrivenInteractiveTransition { } } + override func cancel() { + super.cancel() + viewController.isInteractivelyAnimatingDismissal = false + } + }