swift 在制作NSWindow时如何防止内容淀粉到标题栏下?

jv4diomz  于 2023-03-16  发布在  Swift
关注(0)|答案(1)|浏览(110)

如果我使用此代码的内容将在正确的位置在窗口中,像这样:

import Cocoa

class ViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.wantsLayer = true
        self.view.layer?.backgroundColor = NSColor.blue.cgColor
        self.view.layer?.cornerRadius = 100

    }

}

但是,如果我使用这个代码的内容将低于标题,这不是我想要的:

import Cocoa

class AppDelegate: NSObject, NSApplicationDelegate {
    
    private lazy var window: NSWindow = NSWindow()
    
    func applicationDidFinishLaunching(_ aNotification: Notification) {
        
        window.styleMask = [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView]
        window.backingType = .buffered
        window.title = "Window"
        
        let blueView: NSView = NSView()
        blueView.wantsLayer = true
        blueView.layer?.backgroundColor = NSColor.blue.cgColor
        blueView.layer?.cornerRadius = 100

        window.contentView = blueView

        window.center()
        window.setFrameAutosaveName("Main Window")
        window.isMovableByWindowBackground = true
        window.makeKeyAndOrderFront(window)
        
    }

}

我知道我可以用约束来解决这个问题,但这不应该是一个问题来解决它,因为它是内容,它应该都在窗口的可见部分,而不是标题栏下。我如何才能解决这个问题,而不必使用约束,并试图找到一个硬编码值来解决这个问题,使用具有硬编码值的约束来使内容成为可见部分不是最好看的方法。

rqdpfwrv

rqdpfwrv1#

这是因为您使用.fullSizeContentView作为窗口的styleMask之一。当与.titled结合使用时,.fullSizeContentView意味着内容视图将扩展到标题栏“下方”。
documentation
设置后,窗口的contentView会占用窗口的全部大小。虽然你可以将这个常量与其他窗口样式掩码组合,但它只适用于带有标题栏的窗口。注意,使用这个掩码会选择层支持。使用contentLayoutRectcontentLayoutGuide来布局标题栏-工具栏区域下的视图。
因此,一个简单的修复方法就是删除.fullSizeContentView
如果出于某种原因确实需要此样式掩码,可以添加blueView作为内容视图的子视图,并将其约束为contentLayoutGuide

blueView.wantsLayer = true
blueView.layer?.backgroundColor = NSColor.blue.cgColor
blueView.layer?.cornerRadius = 100
blueView.translatesAutoresizingMaskIntoConstraints = false
let contentView = NSView()
window.contentView = contentView
contentView.addSubview(blueView)

// contentLayoutGuide can apparently also be an NSView
// for more info, see: https://developer.apple.com/forums/thread/69189
if let layoutGuide = window.contentLayoutGuide as? NSLayoutGuide {
    NSLayoutConstraint.activate([
        blueView.leftAnchor.constraint(equalTo: layoutGuide.leftAnchor),
        blueView.rightAnchor.constraint(equalTo: layoutGuide.rightAnchor),
        blueView.topAnchor.constraint(equalTo: layoutGuide.topAnchor),
        blueView.bottomAnchor.constraint(equalTo: layoutGuide.bottomAnchor),
    ])
}

相关问题