macOS 上的 Swiftui 表单标签对齐

Posted

技术标签:

【中文标题】macOS 上的 Swiftui 表单标签对齐【英文标题】:Swiftui Form Label alignment on macOS 【发布时间】:2021-03-09 15:37:43 【问题描述】:

我正在 SwiftUI 中为 macOS 构建一个简单的表单,但是一旦我添加了一个选择器,布局就搞砸了。

这是我的代码:

var body: some View 
        GeometryReader  geometry in
            Form 
                HStack 
                    Text("Label")
                        .frame(minWidth: 0.25 * geometry.size.width, alignment: .leading)

                    TextField("", text: $field1)
                

                HStack 
                    Text("Long Label")
                        .frame(minWidth: 0.25 * geometry.size.width, alignment: .leading)
                    TextField("", text: $field2)
                

//                HStack 
//                    Text("Picker")
//                        .frame(minWidth: 0.25 * geometry.size.width, alignment: .leading)
//
//                    Picker("", selection: $selectedColor) 
//                        ForEach(colors, id: \.self) 
//                            Text($0)
//                        
//                    
//                

            
            .padding(20)
        
    

这是出来的形式:

添加一个简单的picker,布局变成:

而且我无法保持所有标签对齐。我尝试向选择器和 HStack 添加一个框架,但没有任何帮助。

我也尝试过:

 Picker(selection: $selectedColor, label: EmptyView() 
    ...
 

和:

 Picker(selection: $selectedColor, label: Text("Picker") 
                        ...
 

得到相同的结果。

如何保持标签对齐?

【问题讨论】:

【参考方案1】:

labelIsHidden() 添加到您的Picker

 HStack 
   Text("Picker").frame(minWidth: 0.25 * geometry.size.width, alignment: .leading)
                    
   Picker("", selection: $selectedColor) 
                        ForEach(colors, id: \.self) 
                            Text($0)
                        
   .labelIsHidden()

【讨论】:

【参考方案2】:

我认为@jnpdx 的回答更好,但这是另一种方式。

读取代码中的cmets: 将 3 个 HStack 嵌入到 VStack 中 将 minWidth 更改为 0.24
import SwiftUI

struct ContentView: View 
  var body: some View 
    GeometryReader  geometry in
      Form 
        // Embed 3 HStacks into a VStack
        VStack 
          HStack 
            Text("Label")
              .frame(minWidth: 0.25 * geometry.size.width, alignment: .leading)
            TextField("label", text: .constant("")).labelStyle(IconOnlyLabelStyle())
          
          
          HStack 
            Text("Long label")
              .frame(minWidth: 0.25 * geometry.size.width, alignment: .leading)
            TextField("long Label", text: .constant(""))
          
          
          HStack 
            Text("Picker")
              // Change minWidth to 0.24
              .frame(minWidth: 0.24 * geometry.size.width, alignment: .leading)
            Picker("", selection: .constant(Color.red)) 
              ForEach([Color.red, Color.green, Color.blue], id: \.self) 
                Text($0.description)
              
            
          
        
        
      
      .padding(20)
    
  


struct ContentView_Previews: PreviewProvider 
  static var previews: some View 
    ContentView()
  

【讨论】:

这也可以,但在我的情况下不行。我简化了问题的实际代码,我的表单包含部分,我的选择器在部分内。这个解决方案搞砸了下一部分。

以上是关于macOS 上的 Swiftui 表单标签对齐的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI for MacOS 中的多行 TextField/TextEditor 表单

跨表单部分对齐视图

在 ScrollView 中将文本对齐为前导 - SWIFTUI

SwiftUI 简明教程之自定义对齐方式

SwiftUI 标签文本和图像垂直未对齐

macOS 上的 SwiftUI 选择器