我有一段简单的 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 生命周期,请这样做。
NSHostingView
SwiftUI根据设置了 AutoLayout 约束sizingOptions
。默认值包括 SwiftUI 视图的最小、最大和固有内容大小的约束。您使用的 SwiftUI 视图非常小,因此窗口最终也会非常小。此外,设置
NSWindow.contentView
为NSHostingView
会导致窗口的最小尺寸和最大尺寸由 SwiftUI 视图决定。从sizingOptions
您可能知道,
contentMinSize
优先于minSize
。为了达到预期的效果,我只想设置
sizingOptions
为.minSize
。使用修饰符设置最小尺寸.frame
,因为我们不再控制了contentMinSize
。