From 37eca71e776fb4a23c047475fa27c3e750d02869 Mon Sep 17 00:00:00 2001 From: Igor Solomennikov Date: Tue, 8 Aug 2023 09:35:13 -0700 Subject: [PATCH] Fix tall images overlapping safe area. --- .../MediaItemViewController.swift | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/Signal/src/ViewControllers/MediaGallery/MediaItemViewController.swift b/Signal/src/ViewControllers/MediaGallery/MediaItemViewController.swift index 76158eac66..3d41ead816 100644 --- a/Signal/src/ViewControllers/MediaGallery/MediaItemViewController.swift +++ b/Signal/src/ViewControllers/MediaGallery/MediaItemViewController.swift @@ -4,6 +4,7 @@ // import CoreMedia +import SignalMessaging import SignalServiceKit import SignalUI import YYImage @@ -40,7 +41,7 @@ class MediaItemViewController: OWSViewController, VideoPlaybackStatusProvider { // MARK: - Layout - private var lastKnownScrollViewWidth: CGFloat = 0 + private var lastKnownScrollViewSafeAreaSize: CGSize = .zero private lazy var scrollView: UIScrollView = { let scrollView = UIScrollView(frame: view.bounds) scrollView.delegate = self @@ -89,7 +90,7 @@ class MediaItemViewController: OWSViewController, VideoPlaybackStatusProvider { mediaSize = .zero } - let scrollViewSize = scrollView.bounds.size + let scrollViewSize = scrollView.safeAreaLayoutGuide.layoutFrame.size guard mediaSize.isNonEmpty && scrollViewSize.isNonEmpty else { // Invalid content or view state. @@ -108,8 +109,8 @@ class MediaItemViewController: OWSViewController, VideoPlaybackStatusProvider { // Center the media view in the scroll view. let mediaViewSize = mediaView.frame.size - let yOffset = max(0, (scrollViewSize.height - mediaViewSize.height) / 2) - let xOffset = max(0, (scrollViewSize.width - mediaViewSize.width) / 2) + let yOffset = max(0, (scrollView.bounds.height - mediaViewSize.height) / 2) + let xOffset = max(0, (scrollView.bounds.width - mediaViewSize.width) / 2) mediaViewTopConstraint?.constant = yOffset mediaViewBottomConstraint?.constant = yOffset mediaViewLeadingConstraint?.constant = xOffset @@ -131,6 +132,17 @@ class MediaItemViewController: OWSViewController, VideoPlaybackStatusProvider { } } + private func resetScrollViewZoomIfNecessary() { + // In iOS multi-tasking, the size of root view (and hence the scroll view) + // is set later, after viewWillAppear, etc. Therefore we need to reset the + // zoomScale to the default whenever the scrollView width changes. + let currentScrollViewSize = scrollView.safeAreaLayoutGuide.layoutFrame.size + if !(currentScrollViewSize - lastKnownScrollViewSafeAreaSize).asPoint.fuzzyEquals(.zero, tolerance: 0.001) { + scrollView.zoomScale = scrollView.minimumZoomScale + } + lastKnownScrollViewSafeAreaSize = currentScrollViewSize + } + func zoomOut(animated: Bool) { guard scrollView.zoomScale != scrollView.minimumZoomScale else { return } scrollView.setZoomScale(scrollView.minimumZoomScale, animated: animated) @@ -311,17 +323,8 @@ class MediaItemViewController: OWSViewController, VideoPlaybackStatusProvider { super.viewDidLayoutSubviews() updateZoomScaleAndConstraints() - - // In iOS multi-tasking, the size of root view (and hence the scroll view) - // is set later, after viewWillAppear, etc. Therefore we need to reset the - // zoomScale to the default whenever the scrollView width changes. - let tolerance: CGFloat = 0.001 - let currentScrollViewWidth = scrollView.frame.width - if abs(lastKnownScrollViewWidth - currentScrollViewWidth) > tolerance { - scrollView.zoomScale = scrollView.minimumZoomScale - } - lastKnownScrollViewWidth = currentScrollViewWidth - } + resetScrollViewZoomIfNecessary() + } // MARK: - Helpers