From bb3e1b44b112e33ffff1fdb0309e640968a42777 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Fri, 28 Oct 2022 19:16:00 -0400 Subject: [PATCH] Hide live text controls when other gallery controls are hidden Closes #189 --- .../Large Image/LargeImageContentView.swift | 22 +++++++++++++++++++ .../LargeImageViewController.swift | 1 + 2 files changed, 23 insertions(+) diff --git a/Tusker/Screens/Large Image/LargeImageContentView.swift b/Tusker/Screens/Large Image/LargeImageContentView.swift index f6273dbc..7a3a6875 100644 --- a/Tusker/Screens/Large Image/LargeImageContentView.swift +++ b/Tusker/Screens/Large Image/LargeImageContentView.swift @@ -14,6 +14,7 @@ import VisionKit protocol LargeImageContentView: UIView { var animationImage: UIImage? { get } var activityItemsForSharing: [Any] { get } + func setControlsVisible(_ controlsVisible: Bool) func grayscaleStateChanged() } @@ -22,6 +23,9 @@ class LargeImageImageContentView: UIImageView, LargeImageContentView { #if !targetEnvironment(macCatalyst) @available(iOS 16.0, *) private static let analyzer = ImageAnalyzer() + private var _analysisInteraction: AnyObject? + @available(iOS 16.0, *) + private var analysisInteraction: ImageAnalysisInteraction? { _analysisInteraction as? ImageAnalysisInteraction } #endif var animationImage: UIImage? { image! } @@ -45,6 +49,7 @@ class LargeImageImageContentView: UIImageView, LargeImageContentView { if #available(iOS 16.0, *), ImageAnalyzer.isSupported { let interaction = ImageAnalysisInteraction() + self._analysisInteraction = interaction interaction.delegate = self interaction.preferredInteractionTypes = .automatic addInteraction(interaction) @@ -64,6 +69,17 @@ class LargeImageImageContentView: UIImageView, LargeImageContentView { fatalError("init(coder:) has not been implemented") } + func setControlsVisible(_ controlsVisible: Bool) { + #if !targetEnvironment(macCatalyst) + if #available(iOS 16.0, *), + let analysisInteraction { + // note: passing animated: true here doesn't seem to do anything by itself as of iOS 16.2 (20C5032e) + // so the LargeImageViewController handles animating, but we still need to pass true here otherwise it doesn't animate + analysisInteraction.setSupplementaryInterfaceHidden(!controlsVisible, animated: true) + } + #endif + } + func grayscaleStateChanged() { guard let data = sourceData else { return @@ -113,6 +129,9 @@ class LargeImageGifContentView: GIFImageView, LargeImageContentView { fatalError("init(coder:) has not been implemented") } + func setControlsVisible(_ controlsVisible: Bool) { + } + func grayscaleStateChanged() { // todo } @@ -151,6 +170,9 @@ class LargeImageGifvContentView: GifvAttachmentView, LargeImageContentView { fatalError("init(coder:) has not been implemented") } + func setControlsVisible(_ controlsVisible: Bool) { + } + func grayscaleStateChanged() { // no-op, GifvAttachmentView observes the grayscale state itself } diff --git a/Tusker/Screens/Large Image/LargeImageViewController.swift b/Tusker/Screens/Large Image/LargeImageViewController.swift index f5dfa85b..c6672ca4 100644 --- a/Tusker/Screens/Large Image/LargeImageViewController.swift +++ b/Tusker/Screens/Large Image/LargeImageViewController.swift @@ -174,6 +174,7 @@ class LargeImageViewController: UIViewController, UIScrollViewDelegate, LargeIma self.controlsVisible = controlsVisible if animated { UIView.animate(withDuration: 0.2) { + self.contentView.setControlsVisible(controlsVisible) self.updateControlsView() } } else {