From f6e2a2c358451e56fb7fcd1853034c3efcb7d020 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Tue, 5 Jan 2021 11:54:54 -0300 Subject: [PATCH] Ensure valid layout when single media has footer overlay. --- .../CV/CVComponents/CVComponentBodyMedia.swift | 12 +++++++++++- .../ConversationView/Cells/CVMediaAlbumView.swift | 13 +++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/CV/CVComponents/CVComponentBodyMedia.swift b/Signal/src/ViewControllers/ConversationView/CV/CVComponents/CVComponentBodyMedia.swift index fd9adb7534..3eee47826d 100644 --- a/Signal/src/ViewControllers/ConversationView/CV/CVComponents/CVComponentBodyMedia.swift +++ b/Signal/src/ViewControllers/ConversationView/CV/CVComponents/CVComponentBodyMedia.swift @@ -1,5 +1,5 @@ // -// Copyright (c) 2020 Open Whisper Systems. All rights reserved. +// Copyright (c) 2021 Open Whisper Systems. All rights reserved. // import Foundation @@ -141,9 +141,19 @@ public class CVComponentBodyMedia: CVComponentBase, CVComponent { owsAssertDebug(maxWidth > 0) owsAssertDebug(items.count > 0) + // We may need to reserve space for a footer overlay. + var minWidth: CGFloat = 0 + if let footerOverlay = self.footerOverlay { + let maxFooterWidth = max(0, maxWidth - conversationStyle.textInsets.totalWidth) + let footerSize = footerOverlay.measure(maxWidth: maxFooterWidth, + measurementBuilder: measurementBuilder) + minWidth = min(maxWidth, footerSize.width + conversationStyle.textInsets.totalWidth) + } + let maxWidth = min(maxWidth, maxMediaMessageWidth) return CVMediaAlbumView.layoutSize(maxWidth: maxWidth, + minWidth: minWidth, items: self.items, measurementBuilder: measurementBuilder).ceil } diff --git a/Signal/src/ViewControllers/ConversationView/Cells/CVMediaAlbumView.swift b/Signal/src/ViewControllers/ConversationView/Cells/CVMediaAlbumView.swift index 6f52d4202f..031d5ebc0b 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/CVMediaAlbumView.swift +++ b/Signal/src/ViewControllers/ConversationView/Cells/CVMediaAlbumView.swift @@ -1,5 +1,5 @@ // -// Copyright (c) 2020 Open Whisper Systems. All rights reserved. +// Copyright (c) 2021 Open Whisper Systems. All rights reserved. // import Foundation @@ -243,6 +243,7 @@ public class CVMediaAlbumView: UIStackView { } public class func layoutSize(maxWidth: CGFloat, + minWidth: CGFloat, items: [CVMediaAlbumItem], measurementBuilder: CVCellMeasurement.Builder) -> CGSize { @@ -293,6 +294,10 @@ public class CVMediaAlbumView: UIStackView { let maxMediaWidth: CGFloat = maxWidth let maxMediaHeight: CGFloat = maxWidth var mediaWidth: CGFloat = maxMediaHeight * contentAspectRatio + + // We may need to reserve space for a footer overlay. + mediaWidth = max(mediaWidth, minWidth) + var mediaHeight: CGFloat = maxMediaHeight if mediaWidth > maxMediaWidth { mediaWidth = maxMediaWidth @@ -300,11 +305,11 @@ public class CVMediaAlbumView: UIStackView { } // We don't want to blow up small images unnecessarily. - let kMinimumSize: CGFloat = 150 + let minimumSize: CGFloat = max(150, minWidth) let shortSrcDimension: CGFloat = min(mediaSize.width, mediaSize.height) let shortDstDimension: CGFloat = min(mediaWidth, mediaHeight) - if shortDstDimension > kMinimumSize && shortDstDimension > shortSrcDimension { - let factor: CGFloat = kMinimumSize / shortDstDimension + if shortDstDimension > minimumSize && shortDstDimension > shortSrcDimension { + let factor: CGFloat = minimumSize / shortDstDimension mediaWidth *= factor mediaHeight *= factor }