仅将一个对象与 HStack 中的中心对齐

Align only one object to the centre in an HStack

我正在尝试在 SwiftUI 中创建一个简单的赛程列表(一个团队与另一个团队的列表)。 “vs”Text 字段需要在屏幕上居中对齐,team1 紧靠其左侧,team2 紧靠其右侧。下图显示了一个简单的示例。请注意 vs 如何始终出现在中心线上,并且团队名称基本上是前导或尾随与“vs”Text 框对齐...

如果 3 个文本项在一个简单的 HStack 中对齐,则这些文本字段的总宽度在屏幕上居中对齐,因此“vs”Text 字段会在屏幕上左右晃动。

我相信我可以使用几何体创建上面想要的效果 reader 但这感觉有点费力,我想知道是否有简单的对齐类型或扩展可用于创建想要的效果?

您可以使用对齐指南。此答案还将 vs 置于 屏幕 的中心,而不仅仅是彼此相对。

代码:

struct ContentView: View {
    private let games: [Game] = [
        Game("Manchester United", vs: "Arsenal"),
        Game("Liverpool", vs: "Newcastle United")
    ]

    var body: some View {
        ZStack(alignment: .centerVs) {
            Color.clear
                .frame(height: 0)
                .frame(maxWidth: .infinity)
                .alignmentGuide(.centerVs) { d in
                    d[HorizontalAlignment.center]
                }

            VStack(alignment: .centerVs) {
                ForEach(games) { game in
                    HStack {
                        Text(game.team1)

                        Text("vs")
                            .alignmentGuide(.centerVs) { d in
                                d[HorizontalAlignment.center]
                            }

                        Text(game.team2)
                    }
                }
            }
        }
    }
}
struct Game: Identifiable {
    let id = UUID()
    let team1: String
    let team2: String

    init(_ team1: String, vs team2: String) {
        self.team1 = team1
        self.team2 = team2
    }
}
extension HorizontalAlignment {
    private struct CenterVsAlignment: AlignmentID {
        static func defaultValue(in context: ViewDimensions) -> CGFloat {
            context[HorizontalAlignment.center]
        }
    }

    static let centerVs = HorizontalAlignment(CenterVsAlignment.self)
}

extension Alignment {
    static let centerVs = Alignment(horizontal: .centerVs, vertical: .center)
}

结果: