如何禁用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,提问作者黄建雄
相关产品推荐
相关产品推荐

