在Text视图的许多属性中,我找不到任何与文本对齐相关的属性。我在一个演示中看到它自动处理RTL,当使用View的主体放置东西时,它总是自动居中。

是否有一些概念,我错过了关于SwiftUI布局系统,如果没有,我怎么能设置文本对齐属性的文本?


当前回答

我们需要对齐文本,而不是它所在的堆栈。因此,调用multilineTextAlignment(.center)并设置行限制,我可以看到文本对齐到中心。我不知道为什么我必须设置行限制,我认为如果你有一个大的文本,它会扩展。

Text("blahblah")
        .font(.headline)
        .multilineTextAlignment(.center)
        .lineLimit(50)

其他回答

我们需要对齐文本,而不是它所在的堆栈。因此,调用multilineTextAlignment(.center)并设置行限制,我可以看到文本对齐到中心。我不知道为什么我必须设置行限制,我认为如果你有一个大的文本,它会扩展。

Text("blahblah")
        .font(.headline)
        .multilineTextAlignment(.center)
        .lineLimit(50)

我自己也试图理解这一点,因为这里提到了Text.multilineTextAlignment(_:) / VStack(alignment:) / frame(width:alignment:)),但每个解决方案都解决了一个特定的问题。最终,它取决于UI需求和两者的组合。


VStack(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:)中,对齐是针对给定宽度内的内容。

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))

内部视图是前后对齐的,但视图本身是前后对齐的。


.multilineTextAlignment

这指定了里面文本的对齐方式,当有多行时可以看到最好的效果,否则没有定义框架(width: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))

你总是可以添加一个框架到文本字段,并可以修改它的对齐方式。

Text("Hello World!")
   .frame(alignment : .topLeading)

因为,这只是为了几行-这比在任何一个堆栈上使用对齐要好

您可以将Vertical stackView的对齐方式设置为前导。像下面的

 VStack(alignment: .leading) {
            Text("Turtle Rock")
                .font(.title)
            Text("Joshua Tree National Park")
                .font(.subheadline)
        }

你可以使用SwiftUI的这个属性

multilineTextAlignment

TextAlignment。

VStack { 
    Text("Your Text")
      .multilineTextAlignment(.center)
}