在众多属性中,我找不到任何与文本对齐相关的属性。我在演示中看到它会自动处理RTL,并且使用View的放置内容时,它会自动居中。
我是否缺少有关布局系统的某些概念?如果没有,如何设置Text
的文本对齐属性?
.multilineTextAlignment(.center)
来实现这个功能。Text("CENTER")
.multilineTextAlignment(.center)
从SwiftUI beta 3开始,您可以使用frame修饰符将文本视图居中:
Text("Centered")
.frame(maxWidth: .infinity, alignment: .center)
我试图理解这个问题,因为其他答案提到了 Text.multilineTextAlignment(_:)
/ VStack(alignment:)
/ frame(width:alignment:)
,但每个解决方案都解决一个特定的问题。最终取决于UI要求和这些解决方案的组合。
VStack(alignment:)
这里的alignment
是关于内部视图相互之间的对齐。
因此,指定.leading
会将所有内部视图与彼此的前导边对齐。
VStack(alignment: .leading, spacing: 6) {
Text("Lorem ipsum dolor")
.background(Color.gray.opacity(0.2))
Text("sit amet")
.background(Color.gray.opacity(0.2))
}
.background(Color.gray.opacity(0.1))
.frame
在frame(width:alignment:)
或frame(maxWidth:alignment:)
中,alignment
是指给定宽度内的内容对齐方式。
VStack(alignment: .leading, spacing: 6) {
Text("Lorem ipsum dolor")
.background(Color.gray.opacity(0.2))
Text("sit amet")
.background(Color.gray.opacity(0.2))
}
.frame(width: 380, alignment: .trailing)
.background(Color.gray.opacity(0.1))
内部视图彼此之间是左对齐的,但视图本身相对于 VStack
是右对齐的。
.multilineTextAlignment
这指定了文本的对齐方式,并且在有多行时最为明显。否则,如果没有定义 frame(width:alignment)
,宽度会自动调整,并受默认的 alignment
影响。
VStack(alignment: .trailing, spacing: 6) {
Text("0. automatic frame\n+ view at parent's specified alignment\n+ multilineTA not set by default at leading")
.background(Color.gray.opacity(0.2))
Text("1. automatic frame\n+ view at parent's specified alignment\n+ multilineTA set to center")
.multilineTextAlignment(.center)
.background(Color.gray.opacity(0.2))
Text("2. automatic frame\n+ view at parent's specified alignment\n+ multilineTA set to trailing")
.multilineTextAlignment(.trailing)
.background(Color.gray.opacity(0.2))
}
.frame(width: 380, alignment: .trailing)
.background(Color.gray.opacity(0.1))
VStack(alignment: .trailing, spacing: 6) {
Text("1. automatic frame, at parent's alignment")
.background(Color.gray.opacity(0.2))
Text("2. given full width & leading alignment\n+ multilineTA at default leading")
.frame(maxWidth: .infinity, alignment: .leading)
.background(Color.gray.opacity(0.2))
Text("3. given full width & center alignment\n+ multilineTA at default leading")
.frame(maxWidth: .infinity, alignment: .center)
.background(Color.gray.opacity(0.2))
Text("4. given full width & center alignment\n+ multilineTA set to center")
.multilineTextAlignment(.center)
.frame(maxWidth: .infinity, alignment: .center)
.background(Color.gray.opacity(0.2))
Text("5. given full width & center alignment\n+ multilineTA set to trailing")
.multilineTextAlignment(.trailing)
.frame(maxWidth: .infinity, alignment: .center)
.background(Color.gray.opacity(0.2))
Text("6. given full width but no alignment\n+ multilineTA at default leading\n+ leading is based on content, looks odd sometimes as seen here")
.frame(maxWidth: .infinity)
.background(Color.gray.opacity(0.2))
}
.frame(width: 380)
.background(Color.gray.opacity(0.1))
Spacer().frame(height: 50)
就会变成一行吗?如果我从spacer中删除高度,多行文本就会显示所有行。我该如何强制显示所有行? - fullmoon我曾经遇到过需要将文本对齐到同一行的问题。我发现以下方法管用:
Text("some text")
.frame(alignment: .leading)
如果与框架宽度参数结合使用,您可以为标签等获得一些漂亮的文本块格式。我猜想SwiftUI
希望我们使用像stacks这样的包装器来完成这样的事情。
因此,与其编写像Text("Hello World").aligned(.leading)
这样的内容,更加推荐以下方式:
VStack(alignment: .leading) {
Text("Hello World")
}
我们需要对齐文本而不是它所在的堆栈。因此,调用 multilineTextAlignment(.center)
并设置行限制,我可以看到文本居中对齐。我不知道为什么需要设置行限制,我原以为如果有大段文字就会自动扩展。
Text("blahblah")
.font(.headline)
.multilineTextAlignment(.center)
.lineLimit(50)
我也遇到了同样的问题。 我用这个来修复它。
Text("Test")
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading)
struct LeftAligned: ViewModifier {
func body(content: Content) -> some View {
HStack {
content
Spacer()
}
}
}
extension View {
func leftAligned() -> some View {
return self.modifier(LeftAligned())
}
}
使用方法:
Text("Hello").leftAligned().frame(width: 300)
Spacer()
视图来对齐文本块。这个例子展示了文本在结尾的一侧:HStack{
Spacer()
Text("Wishlist")
}