You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何部分禁用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 14:54:23