【问题标题】:UIStackView spacing not working for nested stack views with baseline alignmentUIStackView 间距不适用于具有基线对齐的嵌套堆栈视图
【发布时间】:2021-10-01 23:26:04
【问题描述】:

我正在尝试在垂直 UIStackView 中包含一系列 UITextFields,以及相应的 UILabel。我将每个标签/字段对嵌套在水平 UIStackView 中,标签的宽度被硬编码为所有标签的最宽固有宽度,以便它们很好地排列。

它几乎可以正常工作,但水平堆栈视图的间距并不像预期的那样均匀(间距 = 5),而是成束并重叠。

但是,如果我删除 hFieldStack.alignment = .lastBaseline 行,那么一切都会完美。

我可以删除该行,因为它看起来不错。但我只是好奇为什么在嵌套堆栈视图中使用 lastBaseline 对齐时,外部堆栈视图中的间距不起作用。

        stackView.axis = .vertical
        stackView.spacing = 5
        stackView.layoutMargins = UIEdgeInsets(top: 5, left: 0, bottom: 0, right: 0)
        stackView.isLayoutMarginsRelativeArrangement = true

        if let titleLabel = titleLabel {
            stackView.addArrangedSubview(titleLabel)
        }
        
        if let messageLabel = messageLabel {
            stackView.addArrangedSubview(messageLabel)
        }
        
        if textFields.count == fieldLabels.count {
            for i in 0..<textFields.count {
                fieldLabels[i].widthAnchor.constraint(equalToConstant: 80).isActive = true
                let hFieldStack = UIStackView()
                hFieldStack.translatesAutoresizingMaskIntoConstraints = false
                hFieldStack.axis = .horizontal
                hFieldStack.alignment = .lastBaseline
                hFieldStack.spacing = 5
                hFieldStack.layoutMargins = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10)
                hFieldStack.isLayoutMarginsRelativeArrangement = true
                hFieldStack.addArrangedSubview(fieldLabels[i])
                hFieldStack.addArrangedSubview(textFields[i])
                stackView.addArrangedSubview(hFieldStack)
            }
        } else {
            logger.error("Field count doesn't match label count")
        }

【问题讨论】:

    标签: swift nested alignment uistackview spacing


    【解决方案1】:

    好奇...

    看来,当将水平堆栈视图的对齐设置为 .lastBaseline.firstBaseline 也会发生)时,自动布局使用文本字段的 _UITextFieldCanvasView em> 来计算布局。

    因此,使用圆角矩形边框,文本字段的实际框架比_UITextFieldCanvasView

    我们可以通过检查视图层次来确认这一点:

    标签与 _UITextFieldCanvasView... 中呈现的文本很好地基线对齐...但框架明显延伸到堆栈视图的框架之外。

    虽然docs.lastBaseline 列为。有效的对齐常量,这有点说明,在 Storyboard / Interface Builder 中,唯一的对齐选项是 FillLeadingCenterTrailing

    我遇到了几个与 StackViews 相关的实际 Bugs --- 所以我想我会(个人)将这个添加到列表中。

    【讨论】:

      猜你喜欢
      • 2021-04-27
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多