Skip to content

Commit

Permalink
Fix a bug where the preview controller breaks when swiping quickly. (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
pixlwave authored Feb 7, 2025
1 parent ddaf41c commit b284aa8
Showing 1 changed file with 21 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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()
}

Expand Down Expand Up @@ -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 }
Expand Down

0 comments on commit b284aa8

Please sign in to comment.