Swift 如何将视图的尾随对齐方式与其父视图对齐';垂直轴是多少?

Swift 如何将视图的尾随对齐方式与其父视图对齐';垂直轴是多少?,swift,swiftui,Swift,Swiftui,我正在尝试使用SwiftUI制作以下布局。 表单标签的尾部对齐与父视图的中心对齐。类似地,TextFields的前导对齐也与父视图的中心对齐 我有以下代码- HStack{ 垫片() VStack{ HStack{ 垫片() 文本(“名称”) 文本字段(“”),文本:。常量(“”) .textFieldStyle(RoundedBorderTextFieldStyle()) .帧(最大宽度:100) } HStack{ 垫片() 文本(“地址”) 文本字段(“”),文本:。常量(“”) .te

我正在尝试使用
SwiftUI
制作以下布局。

表单标签的
尾部
对齐
与父视图的中心对齐。类似地,
TextFields
的前导对齐也与父视图的中心对齐

我有以下代码-

HStack{
垫片()
VStack{
HStack{
垫片()
文本(“名称”)
文本字段(“”),文本:。常量(“”)
.textFieldStyle(RoundedBorderTextFieldStyle())
.帧(最大宽度:100)
}
HStack{
垫片()
文本(“地址”)
文本字段(“”),文本:。常量(“”)
.textFieldStyle(RoundedBorderTextFieldStyle())
.帧(最大宽度:100)
}
HStack{
垫片()
文本(“简短描述”)
文本字段(“”),文本:。常量(“”)
.textFieldStyle(RoundedBorderTextFieldStyle())
.帧(最大宽度:100)
}
}
.优先次序(1)
垫片()
}
导致


我现在没有
Xcode
,但是为什么你不能把所有的文本放到
Vstack
中,把
TextField
放到一个单独的
Vstack
中呢?像这样的

   HStack {
        HStack {        
            VStack(alignment: .trailing) {
                Spacer()
                Text("Name")
                Text("Adress")
                Text("Short Description")

            }

            VStack{

                BorderedTextField(placeholder: "", text: .constant(""))
                    .frame(maxWidth: 100)
                BorderedTextField(placeholder: "", text: .constant(""))
                    .frame(maxWidth: 100)
                BorderedTextField(placeholder: "", text: .constant(""))
                .frame(maxWidth: 100)
            }
        }
        .layoutPriority(1)
        Spacer()
    }

另一种可能性是创建自定义对齐,关于这一点有很多讨论

我提出了一种可能的解决方案,它可以使用
GeometryReader
工作。我仍然希望有更好的方法来做到这一点,但这是可行的:

GeometryReader{中的代理
HStack{
VStack(间距:20){
HStack{
垫片()
文本(“名称”)
}
HStack{
垫片()
文本(“地址”)
}
HStack{
垫片()
文本(“简短描述”)
}
}.frame(宽度:proxy.size.width/2)
VStack{
HStack{
文本字段(“”),文本:。常量(“”)
.textFieldStyle(RoundedBorderTextFieldStyle())
.帧(最大宽度:120)
垫片()
}
HStack{
文本字段(“”),文本:。常量(“”)
.textFieldStyle(RoundedBorderTextFieldStyle())
.帧(最大宽度:120)
垫片()
}
HStack{
文本字段(“”),文本:。常量(“”)
.textFieldStyle(RoundedBorderTextFieldStyle())
.帧(最大宽度:120)
垫片()
}
}.frame(宽度:proxy.size.width/2)
}
}
  • 使用父级的宽度将屏幕分成两个相等的列
  • 将所有表单标签放置在第一列中,并将字段放置在第二列中
  • 调整表单标签之间的间距,使其与相应字段对齐

    • 嗯,我想我已经做到了你要求的。你的解决方案显然是所谓的过度工程。尝试使用较少的视图,并在使用
      GeometryReader
      s深入之前尝试不同的配置。这是我的代码(我在
      ForEach
      中包装了字段):

      字段:

      私有变量字段:一些视图{
      VStack(对齐:。尾部){
      ForEach([“姓名”、“地址”、“简短描述”],id:\.self){s in
      HStack{
      文本(s)
      文本字段(“”),文本:。常量(“”)
      .textFieldStyle(RoundedBorderTextFieldStyle())
      .帧(最大宽度:100)
      }
      }
      }
      }
      
      视图:

      var主体:一些视图{
      ZStack{
      垫片()
      领域
      .alignmentGuide(HorizontalAlignment.center){d in d.width-100}
      }
      }
      
      假设文本字段的宽度保持不变,则此操作有效。对于更复杂的接口,不要避免使用自定义对齐,它们非常酷。我建议观看WWDC会议,尤其是


      希望这能有所帮助

      我尝试了你的代码和两件事。(1) 你没有为
      BorderedTextField
      发布
      struct
      ,所以我只好使用
      TextField
      和10个下划线的值。(2) 但真正的问题是,为什么要添加
      布局优先级(1)
      的修饰符?注释可以解决您的问题。@dfd我已经更新了代码和屏幕截图,使其更清晰。删除
      layoutPriority(1)
      会导致出现错误,因为表单的优先级不高于要安装的垫片。自定义对齐是可能的,但我希望有一个使用默认对齐的解决方案,因为在没有SwiftUI的情况下可以这样做。我们基本上希望将表单标签的尾随对齐方式与父视图的中心向导对齐。我还考虑了两个VStack,但我预计由于使用的字体,每个单元格的水平对齐方式可能会关闭。