我正在尝试创建按钮,这些按钮在必要时会变宽到最大宽度,此时它们会使用“...”来截断标题。我知道按钮框架有一些不寻常的地方,比如在之前或之后应用框架的区别,.buttonStyle
但这种行为让我感到惊讶。
似乎应用maxWidth
会使按钮占用该宽度,即使它不需要。如果您应用为其提供背景的按钮样式,按钮周围就会有空白。
我发现这也适用Text()
。
struct TestButton: View {
let title: String
var body: some View {
Button {
print(title)
} label: {
Text(title)
.lineLimit(1)
}
.frame(maxWidth: 180)
.background(.purple)
.buttonStyle(PlainButtonStyle())
.focusable()
}
}
HStack {
TestButton(title: "Bears")
TestButton(title: "Battlestar Galactica")
}
.frame(maxWidth: 180)
只是在按钮周围包裹了一个不可见的“框架”。这个框架非常灵活 - 如果它收到宽度最多为 180pt 的尺寸建议,它将选择其宽度与建议的宽度相同。否则,它将选择其宽度为 180pt,从而有效地“限制”建议。这正是
HStack
向 提出的建议frame
。HStack
会首先尝试向每个子元素建议相等的宽度,并尝试均匀地布局它们。frame
s 接受这些建议,因为 的HStack
宽度恰好小于 360pt *。您可以向每个按钮添加
fixedSize()
(或),这样就无需向按钮建议特定的宽度,而是将建议发送给s。会将此转发给按钮,按钮将选择适合其内容的大小。当然,如果它们选择的宽度大于 180pt,它仍会受到限制。fixedSize(horizontal:vertical:)
.unspecified
frame
frame
添加
fixedSize()
到HStack
也有效,因为HStack
它还会将提案转发.unspecified
给其子项,而不是尝试将子项均匀分布(它实际上无法做到这一点,因为没有建议的宽度)。但是,
fixedSize()
也不会允许按钮缩小。如果HStack
太窄,按钮将超出 的边界HStack
。如果这是不理想的,您可能需要编写自己的Layout
。虽然在 2 个视图的情况下您想要做什么相对清楚,但您通常希望它如何工作并不十分清楚。*更准确地说,
HStack
本身收到了一个宽度 < 360pt + 的默认间距的尺寸建议HStack
。