我有一个简单的 SwiftUI 代码来启动一个小型 NSWindow,如下所示。然而,当窗口出现时,它非常小并且忽略了最小尺寸。
...
Button("Test Window") {
let window = NSWindow(contentRect: NSRect(x: 0, y: 0, width: 800, height: 600),styleMask: [.titled, .closable, .resizable, .miniaturizable],backing: .buffered, defer: false)
window.minSize = NSSize(width: 200, height: 400)
window.title = "Test Window"
window.contentView = NSHostingView(rootView: TestView())
window.center()
let windowController = NSWindowController(window: window)
windowController.showWindow(self)
}
...
SwiftUI 有指定的打开窗口方式。如果您的应用程序使用 SwiftUI 生命周期,请这样做。
SwiftUI 基于
NSHostingView
在
sizingOptions
上设置自动布局约束。该值的默认值包括 SwiftUI 视图的最小、最大和内在内容大小的约束。您使用的 SwiftUI 视图非常小,因此窗口最终非常小。
此外,将
NSWindow.contentView
设置为 NSHostingView
会导致窗口最小尺寸和最大尺寸由 SwiftUI 视图确定。来自sizingOptions
如果
设置为NSHostingView
的contentView
,它还会根据其 SwiftUI 内容的最小和最大尺寸更新窗口的NSWindow
和contentMinSize
。contentMaxSize
您可能知道,
contentMinSize
优先于 minSize
。
为了达到预期的效果,我会将
sizingOptions
设置为仅 .minSize
。使用 .frame
修饰符设置最小尺寸,因为我们不再控制 contentMinSize
。
let host = NSHostingView(rootView: Text("Foo Bar Baz").frame(minWidth: 200, minHeight: 400))
host.sizingOptions = .minSize
window.contentView = host