在MacOS SwiftUI中,使用按钮设置可调整大小窗口的宽度。

3
我该如何在 Mac OS SwiftUI 中设置一个可调整大小的窗口宽度,并通过按钮来控制预定义的大小?我尝试使用帧修改器,但那会永久地设置宽度。我想让用户能够用鼠标拖动窗口大小并通过按钮设置预定义大小。
struct ResizeTest: App {
    var body: some Scene {
        WindowGroup {
          ContentView()
            .frame(minWidth: 200, maxWidth: 1000)            
            .padding(0)
        }
        .defaultSize(width: 300, height: 400)
        .windowResizability(.contentSize)
    }
}

struct ContentView: View {
  @State var width = 400.0
  
  var body: some View {
    VStack (alignment: .center) {
      Text("width: \(width)")
      Button("600"){ width = 600}
    }
    .frame(width:width )
    .background(Color.green)
  }
}

去掉.frame(minWidth: 200, maxWidth: 1000)这行代码。 - ChrisR
我需要窗口的最小宽度和最大宽度。但是,删除它并不能解决问题,因为窗口不可调整大小,而它应该是可调整大小的。 - mica
1个回答

3

好的,这有点棘手......它有点像一种技巧,但它确实可行:这些按钮会将minWidthmaxWidth都设置为期望的值,以强制调整窗口大小,然后在0.5秒后将这些值重新设置为完全可能的调整范围(200-1000)。

@main
struct ResizeTest: App {
    var body: some Scene {
        WindowGroup {
          ContentView()
        }
        .windowResizability(.contentSize)
    }
}

struct ContentView: View {
    @State var minWidth = 200.0
    @State var maxWidth = 1000.0

    var body: some View {
        GeometryReader { geo in
            VStack (alignment: .center) {
                
                Text("Current width: \(geo.size.width.formatted())")
                    .frame(maxWidth: .infinity)
                
                Button("400"){
                    minWidth = 400 // set
                    maxWidth = 400
                    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // reset after 0.5 secs
                        minWidth = 200
                        maxWidth = 1000
                    }
                }
                Button("600"){
                    minWidth = 600 // set
                    maxWidth = 600
                    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // reset after 0.5 secs
                        minWidth = 200
                        maxWidth = 1000
                    }
                }
            }
        }
        .frame(height: 100)
        .frame(minWidth: minWidth, maxWidth: maxWidth)
        .background(Color.green)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接