SwiftUI在不同的视图容器中对齐两个元素

SwiftUI在不同的视图容器中对齐两个元素,swiftui,Swiftui,我很难在不同的容器视图中水平对齐两个元素。我想将两个分数(红色)水平对齐。我尝试使用一个定制的对齐指南(和定制的CoordinateSpace),虽然这确实对齐了两个分数,但它也导致了相应的堆栈两个更改。我错过了什么?当然,必须有一个简单的方法来做到这一点 struct ContentViewExample: View { var body: some View { VStack(alignment: .leading) { HStack {

我很难在不同的容器视图中水平对齐两个元素。我想将两个分数(红色)水平对齐。我尝试使用一个定制的对齐指南(和定制的CoordinateSpace),虽然这确实对齐了两个分数,但它也导致了相应的堆栈两个更改。我错过了什么?当然,必须有一个简单的方法来做到这一点

struct ContentViewExample: View {
    var body: some View {
        VStack(alignment: .leading) {
            HStack {
                Label("Team 1", systemImage: "seal")
                    .font(.title3)
                Spacer()
                Text("65")
                    .background(Color.red)
                Text("Final")
                    .font(.caption)
                    .padding(.leading)
            }
            HStack {
                Label("Team No 2", systemImage: "seal")
                    .font(.title3)
                Spacer()
                Text("70")
                    .background(Color.red)
            }
        }.padding(.horizontal)
    }
}

这里有一种可能的方法(面向a-la列)


我的解决方案是使用(惰性?)VGrid:

不过我得摆弄一下颜色,我只是放了一些背景和边框,看看哪些东西在哪里。。。如果需要,还可以优化列的宽度。 要阅读网格,我建议:


顺便说一句:自定义对齐将不起作用,因为整个HStack将左右移动,您必须调整“列”的宽度,这将是额外的麻烦。

我决定写一篇media.com文章来回答这个问题,就这样做了。这是解决方案的样子,这是代码。这是文章和解决方案

简言之,我将四个标签正确对齐,然后将四个容器彼此对齐

在这段代码中,我包含了一个滑块,这样您就可以更好地理解它是如何工作的


这回答了你的问题吗?在第二个HStack中添加另一个文本(“最终”)并使其不透明度(0)
    HStack {
        // image column
        VStack {
            Image(systemName: "seal")
            Image(systemName: "seal")
        }
        .font(.title3)

        // text column
        VStack(alignment: .leading) {
            Text("Team 1")
            Text("Team No 2")
        }
        .font(.title3)
        Spacer()

        // score column
        VStack {
            Text("65")
            Text("70")
        }
        .background(Color.red)

        // note column
        VStack {
            Text("Final")
            Text("")
        }
        .font(.caption)
        .padding(.leading)
    }
    .frame(maxWidth: .infinity)
    .padding(.horizontal)
struct Result : Identifiable, Hashable {
    var id = UUID()
    var name: String
    var label: String 
    var score: Int
    var final: Bool
}
var finalScore = [Result(name: "Team 1", label: "seal.fill", score: 167, final: true),
                  Result(name: "Team No 2", label: "seal", score: 65, final: false)]

struct ContentView: View {
    private var columns: [GridItem] = [
        GridItem(alignment: .leading),
        GridItem(alignment: .trailing),
        GridItem(alignment: .leading)
    ]
    
    var body: some View {
            LazyVGrid(
                columns: columns,
                alignment: .center,
                spacing: 16,
                pinnedViews: [.sectionHeaders, .sectionFooters]
            ) {
                Section(header: Text("Results").font(.title)) {
                    ForEach(finalScore) { thisScore in
                        Label(thisScore.name, systemImage: thisScore.label)
                            .background(Color(UIColor.secondarySystemBackground))
                        Text(String(thisScore.score))
                            .background(Color(UIColor.secondarySystemBackground))
                        Text(thisScore.final == true ? "Final" : "")
                            .background(Color(UIColor.secondarySystemBackground))
                    }
                }
            }
            .border(Color(.blue))
    }
}
import SwiftUI

struct ContentView: View {
private var newAlignment1H: HorizontalAlignment = .leading
private var newAlignment1V: VerticalAlignment = .top
private var newAlignment2H: HorizontalAlignment = .trailing
private var newAlignment2V: VerticalAlignment = .top

@State private var zeroX: CGFloat = 160

var body: some View {

    VStack {
        ZStack(alignment: .theAlignment) {
            HStack {
                Label {
                    Text("Team 1")
                        .font(.system(size: 16, weight: .semibold, design: .rounded))
                } icon: {
                    Image(systemName:"seal")
                        .resizable()
                        .scaledToFit()
                        .frame(width: 30)
                }.labelStyle(HorizontalLabelStyle())
            }
            .border(Color.blue)
            .alignmentGuide(.theHorizontalAlignment, computeValue: {d in zeroX})
//              .alignmentGuide(.theHorizontalAlignment, computeValue: {d in d[self.newAlignment2H]})
//              .alignmentGuide(.theVerticalAlignment, computeValue: {d in d[self.newAlignment1V]})
                HStack {
                    Text("65")
                        .font(.system(size: 16, weight: .semibold, design: .rounded))
                        .background(Color.red.opacity(0.2))
                        .frame(width: 128, height: 32, alignment: .trailing)
                        
                    Text("Final")
                        .font(.system(size: 16, weight: .semibold, design: .rounded))
                        .background(Color.red.opacity(0.2))
                        .frame(width: 48, height: 32, alignment: .leading)
                        
                }
                .border(Color.green)
        }
        
        ZStack(alignment: .theAlignment) {
            HStack {
                Label {
                    Text("Team No 2")
                        .font(.system(size: 16, weight: .semibold, design: .rounded))
                } icon: {
                    Image(systemName:"seal")
                        .resizable()
                        .scaledToFit()
                        .frame(width: 30)
                }.labelStyle(HorizontalLabelStyle())
                
            }
//                .alignmentGuide(.theHorizontalAlignment, computeValue: {d in d[self.newAlignment2H]})
//                .alignmentGuide(.theVerticalAlignment, computeValue: {d in d[self.newAlignment1V]})
            .alignmentGuide(.theHorizontalAlignment, computeValue: {d in zeroX})
            .border(Color.pink)
            
            HStack {
                Text("70")
                    .font(.system(size: 16, weight: .semibold, design: .rounded))
                    .background(Color.red.opacity(0.2))
                    .frame(width: 128, height: 32, alignment: .trailing)
                Text("")
                    .background(Color.red.opacity(0.2))
                    .frame(width: 48, height: 32, alignment: .leading)
            }
            .border(Color.orange)
        }
        
        VStack {
            Slider(value: $zeroX, in: 0...200, step: 10)
            Text("\(zeroX)")
        }
        
    }
    
    
}
}



struct VerticalLabelStyle: LabelStyle {
func makeBody(configuration: Configuration) -> some View {
    VStack(alignment: .center, spacing: 8) {
        configuration.icon
        configuration.title
    }
}
}

struct HorizontalLabelStyle: LabelStyle {
func makeBody(configuration: Configuration) -> some View {
    HStack(alignment: .center, spacing: 8) {
        configuration.icon
        configuration.title
    }
}
}

extension VerticalAlignment {
private enum TheVerticalAlignment : AlignmentID {
    static func defaultValue(in d: ViewDimensions) -> CGFloat {
        return d[VerticalAlignment.top]
    }
}

static let theVerticalAlignment = VerticalAlignment(TheVerticalAlignment.self)
}

extension HorizontalAlignment {
private enum TheHorizontalAlignment : AlignmentID {
    static func defaultValue(in d: ViewDimensions) -> CGFloat {
        return d[HorizontalAlignment.leading]
    }
}

static let theHorizontalAlignment = HorizontalAlignment(TheHorizontalAlignment.self)
}

extension Alignment {
static let theAlignment = Alignment(horizontal: .theHorizontalAlignment, vertical: .theVerticalAlignment)
}


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