Fixes for the refactor of the ButtonGroup/SelfSizingCollectionView
Merge branch 'mbruce/bugfixes' of https://gitlab.verizon.com/BPHV_MIPS/vds_ios.git into feature/notificationView # Conflicts: # VDS/Components/Buttons/ButtonGroup/ButtonGroup.swift Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
commit
e33246153a
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
import UIKit
|
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.
|
/// UICollectionView subclassed to deal with Changing the size of itself based on its children and layout and changes of its contentSize.
|
||||||
@objc(VDSSelfSizingCollectionView)
|
@objc(VDSSelfSizingCollectionView)
|
||||||
@ -34,10 +35,13 @@ public final class SelfSizingCollectionView: UICollectionView {
|
|||||||
// MARK: - Private Properties
|
// MARK: - Private Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
private var contentSizeObservation: NSKeyValueObservation?
|
private var contentSizeObservation: NSKeyValueObservation?
|
||||||
|
private var collectionViewHeight: NSLayoutConstraint?
|
||||||
|
private var anyCancellable: AnyCancellable?
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Overrides
|
// MARK: - Overrides
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
/// The natural size for the receiving view, considering only properties of the view itself.
|
/// The natural size for the receiving view, considering only properties of the view itself.
|
||||||
public override var intrinsicContentSize: CGSize {
|
public override var intrinsicContentSize: CGSize {
|
||||||
let contentSize = self.contentSize
|
let contentSize = self.contentSize
|
||||||
@ -63,12 +67,16 @@ public final class SelfSizingCollectionView: UICollectionView {
|
|||||||
//ensure autoLayout uses intrinsic height
|
//ensure autoLayout uses intrinsic height
|
||||||
setContentHuggingPriority(.required, for: .vertical)
|
setContentHuggingPriority(.required, for: .vertical)
|
||||||
setContentCompressionResistancePriority(.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.
|
// 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
|
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 we don't specify `options: [.old, .new]`, the change.oldValue and .newValue will always be `nil`.
|
||||||
if change.newValue != change.oldValue {
|
if change.newValue != change.oldValue {
|
||||||
self?.invalidateIntrinsicContentSize()
|
self?.invalidateIntrinsicContentSize()
|
||||||
|
if let height = change.newValue?.height {
|
||||||
|
self?.collectionViewHeight?.constant = height
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,7 +9,6 @@ import Foundation
|
|||||||
import UIKit
|
import UIKit
|
||||||
import VDSColorTokens
|
import VDSColorTokens
|
||||||
import VDSFormControlsTokens
|
import VDSFormControlsTokens
|
||||||
import Combine
|
|
||||||
|
|
||||||
/// A button group contains combinations of related CTAs including ``Button``, ``TextLink``, and ``TextLinkCaret``. This group component controls a combination's orientation, spacing, size and allowable size pairings.
|
/// A button group contains combinations of related CTAs including ``Button``, ``TextLink``, and ``TextLinkCaret``. This group component controls a combination's orientation, spacing, size and allowable size pairings.
|
||||||
@objc(VDSButtonGroup)
|
@objc(VDSButtonGroup)
|
||||||
@ -63,9 +62,7 @@ open class ButtonGroup: View {
|
|||||||
open var buttons: [ButtonBase] = [] { didSet { setNeedsUpdate() } }
|
open var buttons: [ButtonBase] = [] { didSet { setNeedsUpdate() } }
|
||||||
|
|
||||||
private var _childWidth: ChildWidth?
|
private var _childWidth: ChildWidth?
|
||||||
|
|
||||||
private var anyCancellable: AnyCancellable?
|
|
||||||
|
|
||||||
/// If provided, width of Button components will be rendered based on this value. If omitted, default button widths are rendered.
|
/// If provided, width of Button components will be rendered based on this value. If omitted, default button widths are rendered.
|
||||||
open var childWidth: ChildWidth? {
|
open var childWidth: ChildWidth? {
|
||||||
get { _childWidth }
|
get { _childWidth }
|
||||||
@ -105,7 +102,6 @@ open class ButtonGroup: View {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Private Properties
|
// MARK: - Private Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
fileprivate var collectionViewHeight: NSLayoutConstraint?
|
|
||||||
|
|
||||||
fileprivate lazy var positionLayout = ButtonGroupPositionLayout().with {
|
fileprivate lazy var positionLayout = ButtonGroupPositionLayout().with {
|
||||||
$0.position = .center
|
$0.position = .center
|
||||||
@ -134,12 +130,6 @@ open class ButtonGroup: View {
|
|||||||
super.setup()
|
super.setup()
|
||||||
addSubview(collectionView)
|
addSubview(collectionView)
|
||||||
collectionView.pinToSuperView()
|
collectionView.pinToSuperView()
|
||||||
collectionViewHeight = heightAnchor.constraint(equalToConstant: VDS.Button.Size.large.height)
|
|
||||||
collectionViewHeight?.activate()
|
|
||||||
anyCancellable = positionLayout.$layoutHeight.receive(on: RunLoop.main).sink { [weak self] _ in
|
|
||||||
guard let self else { return }
|
|
||||||
self.collectionViewHeight?.constant = self.collectionView.intrinsicContentSize.height
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -190,7 +180,6 @@ open class ButtonGroup: View {
|
|||||||
DispatchQueue.main.async { [weak self] in
|
DispatchQueue.main.async { [weak self] in
|
||||||
guard let self else { return }
|
guard let self else { return }
|
||||||
self.collectionView.collectionViewLayout.invalidateLayout()
|
self.collectionView.collectionViewLayout.invalidateLayout()
|
||||||
self.collectionViewHeight?.constant = self.collectionView.intrinsicContentSize.height
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -193,6 +193,9 @@ class ButtonGroupPositionLayout: UICollectionViewLayout {
|
|||||||
// get the rect size of the button
|
// get the rect size of the button
|
||||||
itemSize = delegate.collectionView(collectionView, sizeForItemAtIndexPath: indexPath)
|
itemSize = delegate.collectionView(collectionView, sizeForItemAtIndexPath: indexPath)
|
||||||
|
|
||||||
|
// ensure the width is not greater than the collectionViewWidth
|
||||||
|
itemSize.width = min(itemSize.width, collectionViewWidth)
|
||||||
|
|
||||||
// determine if the current button will fit in the row
|
// determine if the current button will fit in the row
|
||||||
let rowItemCount = rows.last?.attributes.count ?? 0
|
let rowItemCount = rows.last?.attributes.count ?? 0
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user