Ios 快捷文本对齐

Ios 快捷文本对齐,ios,swift,swiftui,Ios,Swift,Swiftui,在Text视图的许多属性中,我找不到任何与文本对齐相关的属性。我在一个演示中看到,它会自动处理RTL,当使用View的主体放置东西时,它总是自动将其居中 关于SwiftUI中的布局系统,我是否缺少一些概念?如果没有,如何将文本对齐属性设置为text 因此,与其编写类似于文本(“Hello World”).aligned(.leading)的内容,不如采用以下方法: VStack(alignment: .leading) { Text("Hello World") } 可以将垂直stac

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


关于
SwiftUI
中的布局系统,我是否缺少一些概念?如果没有,如何将文本对齐属性设置为
text

因此,与其编写类似于
文本(“Hello World”).aligned(.leading)
的内容,不如采用以下方法:

VStack(alignment: .leading) {
    Text("Hello World")
}

可以将垂直stackView的对齐设置为前导对齐。如下

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

您可以通过修改器
.multilitextalignment(.center)
执行此操作


从SwiftUI beta 3开始,您可以使用框架修改器将文本视图居中:

Text("Centered")
    .frame(maxWidth: .infinity, alignment: .center)

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

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

实际上,我遇到了一个问题,我必须在一行上对齐文本。我发现它的工作原理是:

Text("some text")
    .frame(alignment: .leading)

如果将此参数与frame width参数结合使用,则可以为标签等获得一些不错的文本块格式。

如果要保持文本的恒定宽度,“.multilineTextAlignment(.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)

我自己也试图理解这一点,因为这里的其他答案提到了
Text.multilitextalignment(:)
/
VStack(alignment:)
/
frame(width:alignment:)
,但每个解决方案都解决了一个特定的问题。最终,它取决于用户界面需求和这些需求的组合


VStack(对齐:)
此处的
对齐
用于内部视图的相对位置。
因此,指定
.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
框架(宽度:对齐:)
框架(最大宽度:对齐:)
中,
对齐
用于给定宽度内的内容

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
对齐


.multilitextalignment
这指定了内部文本的对齐方式,并且当有多行没有定义的
框架(宽度:对齐)
时,可以看到最好的对齐方式,宽度会自动调整,并受到默认
对齐方式的影响

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


组合测试:

我想使用
Spacer()
视图来对齐文本块。 此示例在尾端显示文本:

HStack{
    Spacer()
    Text("Wishlist")
}

不确定这是否是您要寻找的答案,但我已经体验到,对于阿拉伯语等语言,SwiftUI会自动切换到RTL,您不需要在UIKit中明确指定该选项。

所以我不能只删除一个独立于堆栈的标签?@inokey我至少找不到用于此的修饰符。我也没有找到。在我看来,我似乎错过了SUI的一些基本概念。我甚至不能将“视图”放在两个对象之间,并给它一个颜色,就像它们没有普通的a-la-ui视图对象一样。框架修改器有一个对齐参数,这看起来很愚蠢(尽管它确实有效)。你们从哪里听说这是被鼓励的?有什么东西可以证明这篇文章的合理性吗?这是一个非常令人信服的答案。非常感谢。我也会考虑把这个问题作为一个被接受的答案。“伊诺基高兴地分享我的观察结果:”后来我发现了一篇有趣的文章,深入地看了一般的观点:令人敬畏的人。自从我最初发布这个问题以来,SwiftUI真的发生了变化。这是最好的解决方案!
HStack{
    Spacer()
    Text("Wishlist")
}