gpt4 book ai didi

ios - 为什么 UIStackView 不断折叠标签?

转载 作者:行者123 更新时间:2023-11-29 05:36:05 25 4
gpt4 key购买 nike

我在水平堆栈 View 中嵌入了一个标签和一个按钮 - 一个温度标签和一个 °C/°F 按钮(以粗体突出显示用户偏好;当他们点击按钮时,偏好切换和温度标签更新)。

当 °C 以粗体显示时没问题,但当我更改首选项且 °F 变为粗体时,按钮会折叠成仅显示 °...°F。 stack view被分发给Fill。我认为标签的水平内容压缩阻力优先级应该更高,以防止其折叠,但这不会改变任何东西(我尝试将其设置为 759),所以我不知道要搜索/更改什么来纠正这个。

有人可以告诉我可能会发生什么吗?

The correct appearance for the label and button.

The collapsed appearance.

非常感谢!

编辑:UIStackView 中的标签和按钮之间没有其他约束。堆栈 View 位于带有城市标签的垂直堆栈 View 中 - 请参见图片。 The two stack views.该垂直堆栈 View 固定在屏幕的顶部和底部。

Xcode overview of stack views.

第二次编辑:按下按钮时,我执行以下操作:

@IBAction func updateTemperaturePreference(_ sender: TemperaturePreferenceButton) {
temperaturePreference = (temperaturePreference == .celsius) ? .fahrenheit: .celsius
}

TemperaturePreference 上有一个 didSet,因此当它更改时,它会调用自定义按钮上的 updateStyle:

   temperaturePreferenceButton.updateStyle(temperaturePreference: temperaturePreference)

这是我的自定义按钮的代码:

class TemperaturePreferenceButton: UIButton {

let title = UnitTemperature.celsius.symbol + "/" + UnitTemperature.fahrenheit.symbol + "Some more text"

override init(frame: CGRect) {
super.init(frame: frame)
setupButton()
}

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupButton()
}

private func setupButton() {
setTitle(title, for: .normal)
}

func updateStyle(temperaturePreference: TemperaturePreference) {
switch temperaturePreference {
case .celsius:
let range = NSRange(location: 0, length: 2)
titleLabel?.attributedText = attributedString(from: title, boldRange: range)

case .fahrenheit:
let range = NSRange(location: 3, length: 2)
titleLabel?.attributedText = attributedString(from: title, boldRange: range)
}
setNeedsDisplay()
}

private func attributedString(from string: String, boldRange: NSRange?) -> NSAttributedString {
let fontSize = UIFont.systemFontSize
let attributes = [
NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: fontSize),
NSAttributedString.Key.backgroundColor: UIColor.blue
]
let nonBoldAttributes = [
NSAttributedString.Key.font: UIFont.systemFont(ofSize: fontSize),
NSAttributedString.Key.backgroundColor: UIColor.red
]
let attributedString = NSMutableAttributedString(string: string, attributes: nonBoldAttributes)
if let range = boldRange {
attributedString.setAttributes(attributes, range: range)
}
return attributedString
}

}

最佳答案

使用:

titleLabel?.attributedText = attributedString(from: title, boldRange: range)

不允许 UIKit 和自动布局完全处理更改。尝试使用这个:

setAttributedTitle(attributedString(from: title, boldRange: range), for: .normal)

应该解决这个问题。如果您仍然发现问题,请添加 .sizeToFit():

setAttributedTitle(attributedString(from: title, boldRange: range), for: .normal)
sizeToFit()

关于ios - 为什么 UIStackView 不断折叠标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57026092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com