NSWindow.Level 是 macOS 中用于控制窗口层级(z-index) 的属性,决定窗口是否覆盖或被其他窗口覆盖。窗口层级会影响窗口是否浮动在最前、是否能被点击穿透等。
标准窗口层级列表(完整)
extension NSWindow.Level {
public static let normal: NSWindow.Level // 默认窗口层级(0)
public static let floating: NSWindow.Level // 浮动层级(3)
public static let submenu: NSWindow.Level // 子菜单窗口层级
public static let tornOffMenu: NSWindow.Level // 拖出的菜单窗口层级
public static let mainMenu: NSWindow.Level // 主菜单层级
public static let statusBar: NSWindow.Level // 状态栏窗口层级
public static let modalPanel: NSWindow.Level // 模态对话框层级
public static let popUpMenu: NSWindow.Level // 弹出菜单层级
public static let screenSaver: NSWindow.Level // 屏幕保护程序层级(最高)
@available(macOS, introduced: 10.0, deprecated: 10.13)
public static let dock: NSWindow.Level // Dock 层级(已弃用)
}
实际的 rawValue 数值:
.normal:值为0,普通窗口;
.floating:值为3,工具窗口,浮动在普通窗口上;
.modalPanel:值为8,模态对话框;
.mainMenu:值为24,主菜单层级;
.statusBar:值为25,比浮动窗口还高;
.popUpMenu:值为101,弹出菜单(如右键菜单);
.submenu:值为102,子菜单;
.tornOffMenu:值为103,拖出的菜单;
.screenSaver:值为1000,最顶层;
.dock:值为-2147483623(已废弃),Dock 层级,仅用于早期系统。
使用建议
1、普通窗口:建议使用 .normal;
2、浮动工具栏:建议使用 .floating;
3、全屏遮罩 / 截图:建议使用 .screenSaver;
4、状态栏小窗:建议使用 .statusBar;
5、避免使用 .dock,已经被废弃,替代方案是 .desktop 或 .normal;
自定义层级
可以使用Level(rawValue:)自定义层级:
let customLevel = NSWindow.Level(rawValue: 500)
window.level = customLevel
相关文章
1、macOS窗口NSWindow:https://fangjunyu.com/2025/07/01/macos%e7%aa%97%e5%8f%a3nswindow/