如何解决UIStackView 间距不适用于具有基线对齐的嵌套堆栈视图
我试图在垂直的 UIStackView 中包含一系列 UITextFields,以及相应的 UILabels。我将每个标签/字段对嵌套在一个水平 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,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")
}
解决方法
好奇...
看来,当将水平堆栈视图的对齐方式设置为 .lastBaseline
(也发生在 .firstBaseline
中)时,自动布局正在使用文本字段的 _UITextFieldCanvasView
计算布局。
因此,对于圆角矩形边框,文本字段的实际框架更高比 _UITextFieldCanvasView
高。
我们可以通过检查视图层次结构来确认这一点:
标签与 _UITextFieldCanvasView
中呈现的文本很好地基线对齐...但框架显然延伸到堆栈视图的框架之外。
虽然 docs 将 .lastBaseline
列为。有效的对齐常量,这有点说明,在 Storyboard / Interface Builder 中,唯一的对齐选项是 Fill
、Leading
、Center
和 Trailing
。
我遇到了几个与 StackViews 相关的实际错误 --- 所以我想我会(个人)将这个添加到列表中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。