有没有办法有条件地翻转 HStack 内容的顺序?

Kil*_*ian 2 swiftui

我正在使用 anHStack在我的视图层次结构中布局一些元素。我希望能够有条件地翻转元素的顺序。

HStack {
  Text("Hello")
  Text("World")
}
Run Code Online (Sandbox Code Playgroud)

这个想法是根据我的视图状态,这将被布局为“Hello World”或“World Hello”。

HStack 本身并没有为此提供任何功能,但它似乎也几乎不可能尝试将其从视图本身中拉出以尝试使用其他 ViewBuilder、基于 ForEach 的方法等。

我可以解决这个问题的唯一方法是完全指定两个布局,这是我试图避免的。

let isFlipped: Bool

HStack {
  if isFlipped {
    Text("World")
    Text("Hello")    
  } else {
    Text("Hello")
    Text("World")
  }
}
Run Code Online (Sandbox Code Playgroud)

Asp*_*eri 5

这是基于使用 ViewBuilder 的任何容器中任何对视图的可能通用方法。

使用 Xcode 12 测试

在此处输入图片说明

struct TestHStackFlip: View {
    @State private var flipped = false
    var body: some View {
        VStack {
            HStack {
                FlipGroup(if: flipped) {
                    Text("Text1")
                    Text("Text2")
                }
            }.animation(.default)     // animatable
            Divider()
            Button("Flip") { self.flipped.toggle() }
        }
    }
}

@ViewBuilder
func FlipGroup<V1: View, V2: View>(if value: Bool,
                @ViewBuilder _ content: @escaping () -> TupleView<(V1, V2)>) -> some View {
    let pair = content()
    if value {
        TupleView((pair.value.1, pair.value.0))
    } else {
        TupleView((pair.value.0, pair.value.1))
    }
}
Run Code Online (Sandbox Code Playgroud)