From 0aea28663099d94f2cb1d0f6af7c1ae2751ff8e2 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Wed, 14 Feb 2024 09:05:41 -0600 Subject: [PATCH] pushing the heightConstraint into the selfsizingcv Signed-off-by: Matt Bruce --- VDS/Classes/SelfSizingCollectionView.swift | 8 ++++++++ VDS/Components/Buttons/ButtonGroup/ButtonGroup.swift | 4 ---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/VDS/Classes/SelfSizingCollectionView.swift b/VDS/Classes/SelfSizingCollectionView.swift index 3a99404a..c50082c4 100644 --- a/VDS/Classes/SelfSizingCollectionView.swift +++ b/VDS/Classes/SelfSizingCollectionView.swift @@ -7,6 +7,7 @@ import Foundation import UIKit +import Combine /// UICollectionView subclassed to deal with Changing the size of itself based on its children and layout and changes of its contentSize. @objc(VDSSelfSizingCollectionView) @@ -34,10 +35,13 @@ public final class SelfSizingCollectionView: UICollectionView { // MARK: - Private Properties //-------------------------------------------------- private var contentSizeObservation: NSKeyValueObservation? + private var collectionViewHeight: NSLayoutConstraint? + private var anyCancellable: AnyCancellable? //-------------------------------------------------- // MARK: - Overrides //-------------------------------------------------- + /// The natural size for the receiving view, considering only properties of the view itself. public override var intrinsicContentSize: CGSize { let contentSize = self.contentSize @@ -63,12 +67,16 @@ public final class SelfSizingCollectionView: UICollectionView { //ensure autoLayout uses intrinsic height setContentHuggingPriority(.required, for: .vertical) setContentCompressionResistancePriority(.required, for: .vertical) + collectionViewHeight = heightAnchor.constraint(equalToConstant: 0).activate() // Observing the value of contentSize seems to be the only reliable way to get the contentSize after the collection view lays out its subviews. self.contentSizeObservation = self.observe(\.contentSize, options: [.old, .new]) { [weak self] _, change in // If we don't specify `options: [.old, .new]`, the change.oldValue and .newValue will always be `nil`. if change.newValue != change.oldValue { self?.invalidateIntrinsicContentSize() + if let height = change.newValue?.height { + self?.collectionViewHeight?.constant = height + } } } } diff --git a/VDS/Components/Buttons/ButtonGroup/ButtonGroup.swift b/VDS/Components/Buttons/ButtonGroup/ButtonGroup.swift index 113d19f5..a80594fc 100644 --- a/VDS/Components/Buttons/ButtonGroup/ButtonGroup.swift +++ b/VDS/Components/Buttons/ButtonGroup/ButtonGroup.swift @@ -103,7 +103,6 @@ open class ButtonGroup: View { //-------------------------------------------------- // MARK: - Private Properties //-------------------------------------------------- - fileprivate var collectionViewHeight: NSLayoutConstraint? fileprivate lazy var positionLayout = ButtonGroupPositionLayout().with { $0.position = .center @@ -132,8 +131,6 @@ open class ButtonGroup: View { super.setup() addSubview(collectionView) collectionView.pinToSuperView() - collectionViewHeight = heightAnchor.constraint(equalToConstant: VDS.Button.Size.large.height) - collectionViewHeight?.activate() } //-------------------------------------------------- @@ -184,7 +181,6 @@ open class ButtonGroup: View { DispatchQueue.main.async { [weak self] in guard let self else { return } self.collectionView.collectionViewLayout.invalidateLayout() - self.collectionViewHeight?.constant = self.collectionView.intrinsicContentSize.height } } }