refactored to have a public contentSize publisher

Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
Matt Bruce 2024-03-11 13:51:19 -05:00
parent 73c7e23b99
commit 6aa09da464

View File

@ -36,7 +36,15 @@ public final class SelfSizingCollectionView: UICollectionView {
//-------------------------------------------------- //--------------------------------------------------
private var collectionViewHeight: NSLayoutConstraint? private var collectionViewHeight: NSLayoutConstraint?
private var anyCancellable: AnyCancellable? private var anyCancellable: AnyCancellable?
private var contentSizeSubject = CurrentValueSubject<CGSize, Never>(.zero)
//--------------------------------------------------
// MARK: - Public Properties
//--------------------------------------------------
public var contentSizePublisher: AnyPublisher<CGSize, Never> {
contentSizeSubject.eraseToAnyPublisher()
}
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Overrides // MARK: - Overrides
//-------------------------------------------------- //--------------------------------------------------
@ -67,17 +75,13 @@ public final class SelfSizingCollectionView: UICollectionView {
setContentCompressionResistancePriority(.required, for: .vertical) setContentCompressionResistancePriority(.required, for: .vertical)
collectionViewHeight = heightAnchor.constraint(equalToConstant: 0).activate() collectionViewHeight = heightAnchor.constraint(equalToConstant: 0).activate()
anyCancellable = self.publisher(for: \.contentSize, options: [.old, .new]) anyCancellable = self.publisher(for: \.contentSize, options: [.new])
.scan((old: CGSize.zero, new: CGSize.zero)) { accumulator, newValue in
// accumulator.old contains the old contentSize value
// accumulator.new contains the new contentSize value before the current update
// newValue is the current update to contentSize
return (old: accumulator.new, new: newValue)
}
.sink { [weak self] compare in .sink { [weak self] compare in
if compare.old != compare.new { guard let self else { return }
self?.invalidateIntrinsicContentSize() if compare.height != self.collectionViewHeight?.constant {
self?.collectionViewHeight?.constant = compare.new.height self.invalidateIntrinsicContentSize()
self.collectionViewHeight?.constant = compare.height
self.contentSizeSubject.send(compare)
} }
} }
} }