UILabel 阻止 UIButton 显示,直到您从调试视图层次结构继续

Posted

技术标签:

【中文标题】UILabel 阻止 UIButton 显示,直到您从调试视图层次结构继续【英文标题】:UILabel prevents UIButton from being shown until you continue from debug view hierarchy 【发布时间】:2017-05-19 11:05:51 【问题描述】:

我有一个包含 3 个排列的子视图的堆栈视图;一个带有复选框图像的按钮,一个带有一些文本的标签和另一个带有“i”图像的按钮。创建视图时,由于某种原因没有显示最后一个按钮,所以我去调试视图层次结构,在那里我可以在视图列表中看到按钮,但在实际视图中看不到。然后当我按下继续停止调试视图层次结构时,按钮突然出现并挤压标签以使其适合。

如果我删除标签,两个按钮都显示得很好。如果我将视图放在 UIView 而不是堆栈视图中,则不会显示“i”按钮。如果我缩短标签上的文本,“i”按钮会正确显示。编辑:我还尝试切换标签和“i”按钮,然后两者都正确显示。

您知道当您继续调试可能会改变视图时会调用哪些方法吗?你知道解决这个问题的另一种方法吗?

谢谢

编辑:Stackviews 约束只是带有一些插入常量的超级视图约束:

NSLayoutConstraint.activate([
stackView.topAnchor.constraint(equalTo: view.topAnchor, constant: 12),
        stackView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 12),
        stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10),
        stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 10)
])

按钮和标签只是作为排列好的子视图添加,没有添加约束

【问题讨论】:

在您的故事板中,将您的堆栈视图分布属性设置为平均填充 .. 并将您的标签自动收缩属性设置为最小字体大小等 ..11 如果有的话,请在堆栈视图上/在堆栈视图中分享带有约束的屏幕截图 已编辑以显示约束 为什么你的 stackView 有一个底部约束?如果按钮很小,让 stackView 自行决定高度 您是否在后台线程上设置此视图(实例化元素、添加元素、设置约束等)?这可能是您会看到让代码运行和通过调试中断代码之间存在差异的原因。也许显示您正在使用的完整代码? 【参考方案1】:

选择 StackView 转到 Attributes Inspector 检查 Alignment = fill & Distribution = fill 现在选择 StackView 内的 label Size Inspector 查找内容 Hugging priority & content Compression Resistance Priority 水平优先级小于 250 这样标签可以很容易地被拉伸和压回 p>

更新:

我添加了 2 个按钮和一个标签,我只是在按钮中使用了文本和颜色来模拟您需要的内容。

    override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    let label = UILabel()
    let checkmarkButton = UIButton()
    let infoButton = UIButton()

    label.text = "Jeg acceptere vilkår og betinging"
    label.setContentHuggingPriority(240.0, for: .horizontal)
    label.setContentCompressionResistancePriority(240, for: .horizontal)
    label.textAlignment = .center


    checkmarkButton.setTitle("Check", for: .normal)
    checkmarkButton.backgroundColor = UIColor.blue

    infoButton.setTitle("info", for: .normal)
    infoButton.backgroundColor = UIColor.gray


    view.addSubview(label)
    view.addSubview(checkmarkButton)
    view.addSubview(infoButton)



    let stackView = UIStackView(arrangedSubviews: [checkmarkButton, label, infoButton])
    stackView.translatesAutoresizingMaskIntoConstraints = false
    stackView.axis = .horizontal
    stackView.alignment = .fill
    stackView.distribution = .fill




    view.addSubview(stackView)

    // You have set the trailing constant to 12 which is going outside of the screen if you want to set the trailingAnchor constant programmatically it should be negative
    NSLayoutConstraint.activate([
        stackView.topAnchor.constraint(equalTo: view.topAnchor, constant: 80),
        stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -12),
        stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 12)
        ])


【讨论】:

我正在以编程方式工作,但我尝试按照您的建议设置所有这些,但并没有改变任何内容,不过感谢您的建议。 你对stackView有适当的约束吗? 啊,我第一次错过了 setContentCompressionResistancePriority,这很重要,非常感谢!!

以上是关于UILabel 阻止 UIButton 显示,直到您从调试视图层次结构继续的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 UIButtons 读取 UILabel(没有文本)

使用 UILabel 和 UIButton 显示用户标签

使用 UIButton 从 UIPickerView 向 UILabel 显示输出

根据 UIButton 控件事件更改 UILabel

自动布局:包含 UILabel + UIButton 的标题视图

UILabel && UIButton