cocoa - 如何使用自动布局调整 NSWindow 的大小?
问题描述
一直在尝试 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
。也许我需要先确保这一点。)
解决方案
如果窗口大小在两个方向上都不是动态的(例如将窗口添加到工作表),请尝试fixedSized
在一个或两个方向上将视图修改器添加到您的 SwiftUI 视图。然后视图将保持其内容的理想大小,并且窗口应该在外观上尊重该大小。
我遇到了类似的问题,似乎每当我NSHostingController
直接添加 a 作为 a 的内容时NSWindowController
,与内在大小相关的事情开始变得有点时髦。根据视图检查器的说法,SwiftUI 视图的大小实际上是正确的,但宿主控制器的 NSView 本身不是(其中,afaik 看起来像一个错误。我在 NSHostingController 或 UIHostingController 的其他用法中没有看到这种行为......) .
最后,虽然我没有对此进行太多实验,但使用NSViewController
介于NSWindowController
和NSHostingController
看似有效的中间体。
推荐阅读
- neo4j - Neo4j 在 ORDER BY 上表现不佳
- python - 如何从字符串中删除多次出现的字符?
- python - 将 pycountry 细分翻译成英文
- vpn - 使用本地范围 IP 在本地到 GCloud 计算引擎 VPN
- c# - POST 请求 vue C#
- python - 从 HTML 字符串中提取字符串
- python - 从 HTML 字符串中提取字符串
- azure - 跨具有不同子域的多个应用服务的 Azure 通配符证书使用
- angular - 有没有办法让 Nebular Window 成为背景阴影?
- spring-boot - Rabbit 消息监听器执行失败,错误处理程序抛出异常