如何在以SwiftUI为根视图的NSWindow中移除标题栏并消除间隙?
问题:移除NSWindow标题栏后出现间隙,如何在Cocoa层面解决?
我通过以下代码移除NSWindow的标题栏,虽然标题栏成功移除,但窗口顶部出现了间隙。备注:我不想通过修改SwiftUI视图的修饰符来填充间隙,希望在Cocoa或NSWindow层面解决该问题。

原实现代码:
lazy var window: NSWindow = NSWindow() window.styleMask = [.titled, .fullSizeContentView, .closable] window.backingType = .buffered window.backgroundColor = .clear window.titlebarAppearsTransparent = true window.titleVisibility = .hidden window.standardWindowButton(NSWindow.ButtonType.zoomButton)?.isHidden = true window.standardWindowButton(NSWindow.ButtonType.miniaturizeButton)?.isHidden = true window.contentView = NSHostingView(rootView: TestView()) window.center() window.setFrameAutosaveName("No Title Bar Window") window.isMovableByWindowBackground = true window.makeKeyAndOrderFront(window)
解决方案
问题核心是启用fullSizeContentView后,系统仍保留了标题栏的占位空间,同时标题栏底部的默认分隔线也会造成视觉间隙。直接在NSWindow层面做以下两处修改即可解决:
- 移除标题栏分隔线:添加
window.titlebarSeparatorStyle = .none,消除标题栏底部的默认分隔线(这是间隙的主要视觉来源) - 让内容视图填充整个窗口:设置
window.contentView?.edgesForExtendedLayout = .all,强制内容视图扩展到原标题栏的占位区域
修改后的完整代码:
lazy var window: NSWindow = NSWindow() window.styleMask = [.titled, .fullSizeContentView, .closable] window.backingType = .buffered window.backgroundColor = .clear window.titlebarAppearsTransparent = true window.titleVisibility = .hidden // 新增:移除标题栏底部分隔线 window.titlebarSeparatorStyle = .none window.standardWindowButton(NSWindow.ButtonType.zoomButton)?.isHidden = true window.standardWindowButton(NSWindow.ButtonType.miniaturizeButton)?.isHidden = true window.contentView = NSHostingView(rootView: TestView()) // 新增:让内容视图扩展覆盖整个窗口区域 window.contentView?.edgesForExtendedLayout = .all window.center() window.setFrameAutosaveName("No Title Bar Window") window.isMovableByWindowBackground = true window.makeKeyAndOrderFront(window)
如果仍存在细微布局偏差,可在代码末尾添加一行强制窗口刷新布局:
window.layoutIfNeeded()
内容的提问来源于stack exchange,提问作者swiftPunk
相关产品推荐
相关产品推荐

