我如何通过自动布局调整NSWindow的大小?

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

尝试使用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。也许我需要先确保该设置。)

cocoa autolayout nswindow
1个回答
0
投票

关于使用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
}

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

© www.soinside.com 2019 - 2024. All rights reserved.