【发布时间】:2020-07-11 00:25:04
【问题描述】:
使用老式自动布局很容易实现以下布局,但我不知道如何使用 SwiftUI 做同样的事情。这是我要渲染的视图示例:
这显示了同一视图的 3 个变体。该视图有 3 个文本子项。左、中、右,具有以下属性:
- 左右视图固定在父视图的前导和尾随,中心视图始终保持在父视图的中心 (1)
- 如果任一侧视图缺失或为空 (2),则中心视图保持居中状态
- 中心视图会增长,直到碰到任一侧视图,然后剪切其内容 (3)
我能做的最好的就是下面的这个示例,但它的缺点是中心视图优先于侧视图,因此会剪辑它们。
如何使用 SwiftUI 布局实现这一点?
import SwiftUI
struct MyExample: View {
let leftText:String
let mainText:String
let rightText:String
var body: some View {
HStack{
HStack {
Text(self.leftText)
.modifier(MyBigFont())
Spacer()
}
Text(self.mainText)
.modifier(MyBigFont())
.layoutPriority(1.0)
HStack {
Spacer()
Text(self.rightText)
.modifier(MyBigFont())
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
VStack {
MyExample(leftText:"ABC", mainText:"1234", rightText:"XYZ").padding()
MyExample(leftText:"", mainText:"1234", rightText:"XYZ").padding()
MyExample(leftText:"ABC", mainText:"1234567890", rightText:"XYZ").padding()
Spacer()
}
}
}
struct MyBigFont: ViewModifier {
func body(content: Content) -> some View {
content
.lineLimit(1)
.font(Font.system(size: 42).bold())
}
}
输出:
【问题讨论】:
-
好的,这里有几件事。首先,堆栈视图,它们是救命稻草。其次,您可以在属性面板中设置这些项目的优先级。 Apples HIG 指南建议不要截断字符串,而是建议您缩放它们。我会在可能很长的字符串上设置一个自动缩放因子,然后对需要首先设置的字符串设置优先级。
-
@xTwisteDx 是的,我同意堆栈。同样是的,自动缩放优于截断。我只是想简化这个例子。您可以在我设置优先级的示例中看到。自动缩放对我发布的示例没有帮助,因为它只会在 截断侧视图并用完空间后开始缩放。