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

如何禁用NSWindow的默认调整大小行为(保留可调整与关键窗口特性)

解决NSWindow禁用默认调整大小光标但保留自定义调整及关键窗口能力

核心方案

在macOS中,对应Windows平台WM_HITTEST消息的是NSWindow的hitTest(_:)方法,通过重写该方法,让窗口边缘区域也返回内容视图,即可绕过系统默认的调整大小光标触发逻辑。

具体实现

1. 重写NSWindow的hitTest方法

在自定义NSWindow子类中添加以下代码:

override func hitTest(_ point: NSPoint) -> NSView? {
    // 转换坐标到内容视图坐标系
    let convertedPoint = contentView?.convert(point, from: nil) ?? point
    // 若点在内容视图范围内,直接返回内容视图,跳过系统边缘检测
    if contentView?.bounds.contains(convertedPoint) == true {
        return contentView
    }
    // 其他场景沿用默认逻辑
    return super.hitTest(point)
}

2. 保持窗口必要配置

确保窗口维持可调整、无标题栏边框且能成为关键窗口的状态,示例配置如下:

// 窗口初始化时的样式配置
window.styleMask = [.resizable, .borderless]
window.titlebarAppearsTransparent = true
window.titleVisibility = .hidden

// 确保窗口可成为关键窗口
override var canBecomeKeyWindow: Bool {
    return true
}

原理说明

系统通过hitTest(_:)判断鼠标位置的响应视图,默认情况下鼠标在窗口边缘时会返回边框相关视图,进而触发调整大小光标。重写方法后,边缘区域也返回内容视图,系统便不会触发默认调整逻辑,同时完全不影响你自行实现的自定义调整功能,也保留了窗口成为关键窗口的能力。

内容的提问来源于stack exchange,提问作者黄建雄

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:52:02