From b284aa8a079df15777584285daf09ec3c0f8a266 Mon Sep 17 00:00:00 2001 From: Doug <6060466+pixlwave@users.noreply.github.com> Date: Fri, 7 Feb 2025 10:48:09 +0000 Subject: [PATCH] Fix a bug where the preview controller breaks when swiping quickly. (#3750) --- .../View/TimelineMediaPreviewController.swift | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/ElementX/Sources/Screens/FilePreviewScreen/View/TimelineMediaPreviewController.swift b/ElementX/Sources/Screens/FilePreviewScreen/View/TimelineMediaPreviewController.swift index 2c3f560f6..b52a32cf8 100644 --- a/ElementX/Sources/Screens/FilePreviewScreen/View/TimelineMediaPreviewController.swift +++ b/ElementX/Sources/Screens/FilePreviewScreen/View/TimelineMediaPreviewController.swift @@ -25,6 +25,7 @@ class TimelineMediaPreviewController: QLPreviewController { private var navigationBar: UINavigationBar? { view.subviews.first?.subviews.first { $0 is UINavigationBar } as? UINavigationBar } private var toolbar: UIToolbar? { view.subviews.first?.subviews.last { $0 is UIToolbar } as? UIToolbar } + private var pageScrollView: UIScrollView? { view.firstScrollView() } private var captionView: UIView { captionHostingController.view } override var overrideUserInterfaceStyle: UIUserInterfaceStyle { @@ -184,6 +185,13 @@ class TimelineMediaPreviewController: QLPreviewController { private func handleFileLoaded(itemID: TimelineItemIdentifier.EventOrTransactionID) { guard (currentPreviewItem as? TimelineMediaPreviewItem.Media)?.id == itemID else { return } + + // There's a bug where refreshCurrentPreviewItem completely breaks the QLPreviewController + // if it's called whilst swiping between items. So don't let that happen. + if let scrollView = pageScrollView, scrollView.isDragging || scrollView.isDecelerating { + return + } + refreshCurrentPreviewItem() } @@ -336,6 +344,19 @@ private struct DownloadIndicatorView: View { } } +// MARK: - Helpers + +private extension UIView { + func firstScrollView() -> UIScrollView? { + for view in subviews { + if let scrollView = view as? UIScrollView ?? view.firstScrollView() { + return scrollView + } + } + return nil + } +} + private extension UISheetPresentationController.Detent { static func height(_ height: CGFloat) -> UISheetPresentationController.Detent { .custom { _ in height }