如何将 HSplitView 左右固定到 window 的范围

How to pin HSplitView left and right to the extents of the window

我有一个示例视图,我正在使用它来尝试弄清楚 VSplitView 和 HSplitView 如何协同工作,但我发现它的行为并不像我预期的那样。

struct ContentView: View {
    var body: some View {
      VStack {
        HSplitView {
          VStack {
            VSplitView {
              HStack {
                Spacer()
                Text("top")
                Spacer()
              }
              .frame(maxHeight: .infinity)
              .background(.red)
              HStack {
                Spacer()
                Text("middle")
                Spacer()
              }
              .frame(maxHeight: .infinity)
              .background(.green)
              HStack {
                Spacer()
                Text("bottom")
                Spacer()
              }
              .frame(maxHeight: .infinity)
              .background(.blue)
            }
          }
          VStack {
            Spacer()
            Text("Right")
            Spacer()
          }
          .frame(minWidth: 200, idealWidth: 250, maxWidth: 400)
          .background(.yellow)
        }
        HStack {
          Text("Status")
            .font(.footnote)
            .padding()
            .frame(maxHeight: 20)
          Spacer()
        }
        .background(.gray)
      }.frame(minWidth: 600, maxWidth: .infinity, minHeight: 600, maxHeight: .infinity)
    }
}

我发现当将 HSplitView 分隔线向左拖动足够大时,整个视图会缩小并向左留下 space。分隔器在松开时也会弹回。是否有修改器或更好的布局可用于使其不具有那种奇怪的收缩效果?我没有看到 Xcode 的侧边栏这样做。另外,如何消除 VSplitView 与其下方视图之间的差距?

在 SwiftUI 中 window 大小是基于内容的,所以当你限制内容的最小大小时,你必须对一侧(假设左边)有相同的大小限制,以便通过分隔线改变右边的可能性允许范围内的一侧,即可能的模式如下:

    LeftSideView()
       .frame(minWidth: 600)   // << == to minWidth below

    RightSideView()
       .frame(maxWidth: 200)   // << because this allows 0
  }
  .frame(minWidth: 600, maxWidth: 800, minHeight: 600, maxHeight: 800)

一般计算所有组合内外尺寸之和相等

测试 Xcode 13.2 / macOS 12.2