为什么UIStackView会保持折叠标签?

时间:2019-07-14 09:22:02

标签: ios autolayout uistackview ios-autolayout

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

以°C粗体显示会很好,但是当我更改首选项并且以°F变为粗体时,按钮会折叠成仅显示°...°F。堆栈视图已分发给Fill。我认为标签的水平内容压缩抗性优先级应该更高,以防止其崩溃,但这不会改变任何内容(我尝试将其设置为759),因此我对查找/更改要纠正的内容一无所知这个。

请问有人可以告诉我发生了什么事吗?

The correct appearance for the label and button.

The collapsed appearance.

非常感谢!

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

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
}

}

2 个答案:

答案 0 :(得分:0)

您可以这样做

        let attrTitle = NSMutableAttributedString(string: "°C/°F")
        attrTitle.beginEditing()
        let range = toggle == true ? NSRange(location: 0, length: 2) : NSRange(location: 3, length: 2)
        attrTitle.addAttribute(NSAttributedString.Key.font,
                               value: UIFont.systemFont(ofSize: 14, weight: .bold),
                               range: range)
        attrTitle.endEditing()
        sender.setAttributedTitle(attrTitle, for: .normal)

enter image description here

答案 1 :(得分:0)

使用:

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()