尝试使用Xcode为基于macOS的文档项目编写的SwiftUI默认项目代码。我将窗口创建代码从NSDocument
子类移到了新的NSWindowController
子类。它开始像:
init() {
let content = ContentView()
let windowSize = NSRect(x: 0, y: 0, width: Constants.defaultWidth, height: Constants.defaultHeight)
let window = NSWindow(contentRect: windowSize, styleMask: Constants.windowStyle, backing: .buffered, defer: false)
window.contentView = NSHostingView(rootView: content)
super.init(window: window)
// Other setup.
window.center()
window.delegate = self
}
现在,我想尝试创建不指定其矩形的窗口。为此,有一个初始化程序,它使用NSViewController
作为基数:
init() {
let content = ContentView()
let controller = NSHostingController(rootView: content)
let window = NSWindow(contentViewController: controller)
//window.contentMinSize = NSSize(width: Constants.defaultWidth, height: Constants.defaultHeight)
window.styleMask.formUnion(.fullSizeContentView)
super.init(window: window)
// Other setup.
//window.center()
window.delegate = self
}
ContentView
只是Xcode的默认值,只有一个“ Hello World!”。文本块。它似乎没有内在的大小,因此窗口缩小到了无。现在被注释掉的contentMinSize
属性没有解决。然后,我仔细阅读了初始化程序的文档,并决定尝试使用自动布局。
init() {
// Create and size content.
let content = ContentView()
let controller = NSHostingController(rootView: content)
let guide = NSLayoutGuide()
controller.view.addLayoutGuide(guide)
guide.widthAnchor.constraint(greaterThanOrEqualToConstant: CGFloat(Constants.defaultWidth)).isActive = true
guide.heightAnchor.constraint(greaterThanOrEqualToConstant: CGFloat(Constants.defaultHeight)).isActive = true
controller.view.translatesAutoresizingMaskIntoConstraints = false
//controller.view.autoresizesSubviews = false
let window = NSWindow(contentViewController: controller)
window.styleMask.formUnion(.fullSizeContentView)
super.init(window: window)
// Other setup.
//window.center()
window.delegate = self
}
但是我仍然有一个消失的窗口。 (注释为autoresizesSubviews
的更改无济于事。)然后,我注意到那里有一个窗口,但它的宽度为一个像素,高度约为两个标题栏。但是,当我尝试调整其大小时,该窗口变为可见,跳至文本块所需的最小大小。一旦触摸,我就无法将窗口缩小到显示文本块所需的范围以下。但是,该最小尺寸仍小于我的默认宽度和高度,因此这些设置将被忽略。
所以,我如何按照NSWindow.init(contentViewController:)
的要求使用自动布局来控制窗口的大小?
((嗯,当我键入此查询时,我不确定我对guide
所做的设置是否已连接到controller.view
。也许我需要先确保该设置。)
关于使用controller.view
代替新的NSLayoutGuide
对象的最后怀疑似乎是可行的。
init() {
// Create and size content.
let content = ContentView()
let controller = NSHostingController(rootView: content)
controller.view.autoresizesSubviews = false
controller.view.widthAnchor.constraint(greaterThanOrEqualToConstant: CGFloat(Constants.defaultWidth)).isActive = true
controller.view.heightAnchor.constraint(greaterThanOrEqualToConstant: CGFloat(Constants.defaultHeight)).isActive = true
let window = NSWindow(contentViewController: controller)
window.styleMask.formUnion(.fullSizeContentView)
super.init(window: window)
window.delegate = self
}
但是这只会调整大小;我无法选择窗口在屏幕上的位置。