cocoa - 如何使用自动布局调整 NSWindow 的大小?

标签 cocoa autolayout 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 的默认 View ,只有一个“Hello World!”文本 block 。它似乎没有固有的大小,因此窗口缩小到零。现在注释掉的 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 的注释掉更改没有帮助。)然后我注意到那里有一个窗口,但宽度为一像素,高度约为两个标题栏。但是,当我尝试调整其大小时,窗口变得可见,并跳转到文本 block 所需的最小大小。一旦触摸,我就无法将窗口缩小到显示文本 block 所需的下方。但是,该最小尺寸仍然小于我的默认宽度和高度,因此这些设置将被忽略。

那么,如何根据 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
}

但这只是调整大小;我无法选择窗口在屏幕上的位置。

关于cocoa - 如何使用自动布局调整 NSWindow 的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61297477/

相关文章:

ios7 - UIScrollView + Autolayout + Interface Builder : No scrolling, 弹跳后顶部的额外空间

objective-c - NSWindows 的 setFrame :display:animate: doesn't work, setFrame:display: 确实

objective-c - 关闭 NSWindow 并释放内存,但在单击按钮时重新打开它

macos - cocoa ,输出当前App路径

cocoa - NSImage - 裁剪后 PDF 模糊

swift - "stringByAddingPercentEncodingWithAllowedCharacters"替换了比应有的更多的字符

ios - UICollectionViewCell 以编程方式自动布局

objective-c - 服务菜单启动错误的应用程序包

ios - 使用 uiscrollview 水平滚动完全通过 Storyboard和自动布局

swift - 如何为 NSWindow 的标题栏着色