如果我使用此代码的内容将在正确的位置在窗口中,像这样:
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)
}
}
我知道我可以用约束来解决这个问题,但这不应该是一个问题来解决它,因为它是内容,它应该都在窗口的可见部分,而不是标题栏下。我如何才能解决这个问题,而不必使用约束,并试图找到一个硬编码值来解决这个问题,使用具有硬编码值的约束来使内容成为可见部分不是最好看的方法。
1条答案
按热度按时间rqdpfwrv1#
这是因为您使用
.fullSizeContentView
作为窗口的styleMask
之一。当与.titled
结合使用时,.fullSizeContentView
意味着内容视图将扩展到标题栏“下方”。从documentation:
设置后,窗口的
contentView
会占用窗口的全部大小。虽然你可以将这个常量与其他窗口样式掩码组合,但它只适用于带有标题栏的窗口。注意,使用这个掩码会选择层支持。使用contentLayoutRect
或contentLayoutGuide
来布局标题栏-工具栏区域下的视图。因此,一个简单的修复方法就是删除
.fullSizeContentView
。如果出于某种原因确实需要此样式掩码,可以添加
blueView
作为内容视图的子视图,并将其约束为contentLayoutGuide
。