CXTDT-464973 - Button - Width percentage parameter missing.

Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
Matt Bruce 2023-09-18 16:01:06 -05:00
parent 924653a726
commit 7df4f0cdf9
3 changed files with 58 additions and 11 deletions

View File

@ -77,6 +77,12 @@ open class Button: ButtonBase, Useable {
}
}
}
/// Enum used to describe the width of a fixed value or percentage of parent's width.
public enum Width {
case percentage(CGFloat)
case value(CGFloat)
}
//--------------------------------------------------
// MARK: - Private Properties
@ -92,21 +98,30 @@ open class Button: ButtonBase, Useable {
/// The Use for this Button.
open var use: Use = .primary { didSet { setNeedsUpdate() } }
private var _width: CGFloat? = nil
private var _width: Width? = nil
/// If there is a width that is larger than this size's minmumWidth, the button will resize to this width.
open var width: CGFloat? {
open var width: Width? {
get { _width }
set {
if let newValue, newValue > size.minimumWidth {
_width = newValue
if let newValue {
switch newValue {
case .percentage(let percentage):
if percentage <= 100.0 {
_width = newValue
}
case .value(let value):
if value > 0 && value > size.minimumWidth {
_width = newValue
}
}
} else {
_width = nil
}
setNeedsUpdate()
}
}
open override var textColor: UIColor {
textColorConfiguration.getColor(self)
}
@ -118,13 +133,35 @@ open class Button: ButtonBase, Useable {
/// The natural size for the receiving view, considering only properties of the view itself.
open override var intrinsicContentSize: CGSize {
guard let width, width > 0 else {
var superSize = super.intrinsicContentSize
superSize.height = size.height
return superSize
// get the intrinsic size
var defaultSize = super.intrinsicContentSize
// ensure the size height
defaultSize.height = size.height
// take the max width either intrinsic or size's minimumWidth
defaultSize.width = max(defaultSize.width, size.minimumWidth)
guard let width else {
return defaultSize
}
return CGSize(width: width > size.minimumWidth ? width : size.minimumWidth, height: size.height)
switch width {
case .percentage(let percentage):
// test the superview's width against the percentage to ensure
// it is greater than the size's minimum width
guard let superWidth = superview?.frame.width else {
return defaultSize
}
// if so set the width off percentage
defaultSize.width = max(superWidth * (percentage / 100), size.minimumWidth)
return defaultSize
case .value(let value):
// test fixed value vs minimum width and take the greater value
defaultSize.width = max(value, size.minimumWidth)
return defaultSize
}
}
//--------------------------------------------------
@ -216,6 +253,12 @@ open class Button: ButtonBase, Useable {
invalidateIntrinsicContentSize()
}
open override func layoutSubviews() {
super.layoutSubviews()
invalidateIntrinsicContentSize()
}
}
extension Use {

View File

@ -149,7 +149,7 @@ open class ButtonGroup: View {
case .percentage(let value): percentage = value
}
}
buttons.forEach { ($0 as? Button)?.width = width }
buttons.forEach { if let width { ($0 as? Button)?.width = .value(width) } }
positionLayout.buttonPercentage = percentage
collectionView.reloadData()

View File

@ -1,3 +1,7 @@
1.0.43
=======
- CXTDT-464973 - Button - Width percentage parameter missing.
1.0.42
=======
- CXTDT-462698 - Tabs - Incorrect letter spacing on Large tabs