NSWindow 超级小

问题描述 投票:0回答:1

我有一个简单的 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)
}
...

very tiny window

swift swiftui appkit nswindow
1个回答
0
投票

SwiftUI 有指定的打开窗口方式。如果您的应用程序使用 SwiftUI 生命周期,请这样做。


SwiftUI 基于

NSHostingView
sizingOptions
上设置自动布局约束。该值的默认值包括 SwiftUI 视图的最小、最大和内在内容大小的约束。您使用的 SwiftUI 视图非常小,因此窗口最终非常小。

此外,将

NSWindow.contentView
设置为
NSHostingView
会导致窗口最小尺寸和最大尺寸由 SwiftUI 视图确定。来自
sizingOptions

如果

NSHostingView
设置为
contentView
NSWindow
,它还会根据其 SwiftUI 内容的最小和最大尺寸更新窗口的
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
© www.soinside.com 2019 - 2024. All rights reserved.