如何部分禁用NSWindow的左右分屏平铺属性?
禁用NSWindow的分屏(Tile)功能

在我的NSWindow中,希望禁用「Tile Window to Left of Screen」和「Tile Window to Right of Screen」这两个分屏功能。
现有窗口控制器代码如下:
class VideoWindowController: NSWindowController, NSWindowDelegate { override func windowDidLoad() { super.windowDidLoad() // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. self.window?.titlebarAppearsTransparent = false self.window?.backgroundColor = NSColor.init(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 1.0) self.window?.styleMask = NSWindow.StyleMask(rawValue: NSWindow.StyleMask.resizable.rawValue | NSWindow.StyleMask.titled.rawValue | NSWindow.StyleMask.closable.rawValue | NSWindow.StyleMask.miniaturizable.rawValue) } @objc func setNonResizableStyle() { self.window?.titlebarAppearsTransparent = false self.window?.styleMask = NSWindow.StyleMask(rawValue: NSWindow.StyleMask.titled.rawValue | NSWindow.StyleMask.miniaturizable.rawValue) self.window?.level = .floating } @objc func setResizableStyle() { self.window?.titlebarAppearsTransparent = false self.window?.styleMask = NSWindow.StyleMask(rawValue: NSWindow.StyleMask.resizable.rawValue | NSWindow.StyleMask.titled.rawValue | NSWindow.StyleMask.closable.rawValue | NSWindow.StyleMask.miniaturizable.rawValue) self.window?.level = .normal } }
解决方法
要禁用这两个分屏功能,最直接有效的方式是设置窗口的tabbingMode属性,同时可配合代理方法强化控制:
1. 设置tabbingMode禁用分屏
在窗口初始化以及样式切换的方法中,添加tabbingMode = .disallowed,这会直接禁用分屏和标签页功能:
修改后的完整代码:
class VideoWindowController: NSWindowController, NSWindowDelegate { override func windowDidLoad() { super.windowDidLoad() self.window?.titlebarAppearsTransparent = false self.window?.backgroundColor = NSColor.white self.window?.styleMask = [.resizable, .titled, .closable, .miniaturizable] // 禁用分屏与标签页功能 self.window?.tabbingMode = .disallowed // 关联代理(若未通过nib设置) self.window?.delegate = self } @objc func setNonResizableStyle() { self.window?.titlebarAppearsTransparent = false self.window?.styleMask = [.titled, .miniaturizable] self.window?.level = .floating // 切换样式后保持禁用分屏 self.window?.tabbingMode = .disallowed } @objc func setResizableStyle() { self.window?.titlebarAppearsTransparent = false self.window?.styleMask = [.resizable, .titled, .closable, .miniaturizable] self.window?.level = .normal // 切换样式后保持禁用分屏 self.window?.tabbingMode = .disallowed } }
2. 可选:通过代理方法阻止分屏
如果需要更精细的控制,可以实现NSWindowDelegate的windowShouldTile(_:)方法,返回false来明确阻止分屏操作:
func windowShouldTile(_ window: NSWindow) -> Bool { return false }
说明
设置tabbingMode = .disallowed会同时禁用标签页和分屏功能,刚好匹配你的需求。如果仅需禁用分屏但保留标签页功能,可以调整窗口的collectionBehavior属性,但直接设置tabbingMode是最简单高效的方案。
内容的提问来源于stack exchange,提问作者Shivam Tripathi
相关产品推荐
相关产品推荐

