From c296659ad63d332fbbf6b02a874e8dd8a9ebaefc Mon Sep 17 00:00:00 2001 From: Doug <6060466+pixlwave@users.noreply.github.com> Date: Thu, 8 Oct 2026 11:10:28 +0100 Subject: [PATCH] Only show media captions in QuickLook once. (#6287) --- .../View/TimelineMediaPreviewController.swift | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/ElementX/Sources/Screens/FilePreviewScreen/View/TimelineMediaPreviewController.swift b/ElementX/Sources/Screens/FilePreviewScreen/View/TimelineMediaPreviewController.swift index 8425e84cf..c1cb2d1d2 100644 --- a/ElementX/Sources/Screens/FilePreviewScreen/View/TimelineMediaPreviewController.swift +++ b/ElementX/Sources/Screens/FilePreviewScreen/View/TimelineMediaPreviewController.swift @@ -22,6 +22,9 @@ class TimelineMediaPreviewController: QLPreviewController { private var barButtonTimer: Timer? + /// When not nil, the given item will have its caption hidden. + private var captionHiddenForItemID: MediaPreviewItemID? + @CancellableTask private var settledRefreshTask: Task? /// Media whose file loaded, kept until the swipe settles as each load is only reported once. /// Whichever is on display by then gets refreshed and the rest are dropped. @@ -59,6 +62,10 @@ class TimelineMediaPreviewController: QLPreviewController { captionHostingController.view } + private var currentPreviewItemMediaID: MediaPreviewItemID? { + (currentPreviewItem as? TimelineMediaPreviewItem.Media)?.id + } + /// Whether the displayed placeholder's index now holds a media, or a different placeholder /// having reached the end of the timeline, in which case what's on display is stale. private var isDisplayedPlaceholderStale: Bool { @@ -204,8 +211,14 @@ class TimelineMediaPreviewController: QLPreviewController { private func updateCaptionVisibility() { // The caption should be hidden alongside the header. let isHeaderHidden = headerHostingController.view.window == nil - if captionView.isHidden != isHeaderHidden { - captionView.isHidden = isHeaderHidden + let currentItemID = currentPreviewItemMediaID + + let isHidden = isHeaderHidden || currentItemID == captionHiddenForItemID + if captionView.isHidden != isHidden { + captionView.isHidden = isHidden + if isHidden { + captionHiddenForItemID = currentItemID // Don't show the caption again for this item. + } } } @@ -251,6 +264,14 @@ class TimelineMediaPreviewController: QLPreviewController { private func loadCurrentItem() { headerHostingController.view.sizeToFit() // Resizing isn't automatic in the toolbar 😒 + if #available(iOS 26, *), view.window != nil { + if captionHiddenForItemID != currentPreviewItemMediaID { + captionHiddenForItemID = nil // Allow the caption to be re-shown when swiping. + } + + updateCaptionVisibility() + } + if let previewItem = currentPreviewItem as? TimelineMediaPreviewItem.Media { context.send(viewAction: .updateCurrentItem(.media(previewItem))) } else if let loadingItem = currentPreviewItem as? TimelineMediaPreviewItem.Loading {