macOS状态栏MenuBarExtra
macOS状态栏MenuBarExtra

macOS状态栏MenuBarExtra

MenuBarExtra 是 SwiftUI 在 macOS 13(Ventura)及以上系统中新增的 API,用于创建菜单栏 App(Status Bar App),也就是“状态栏图标 + 菜单内容” 的 App。

它是 SwiftUI 对 AppKit 中 NSStatusItem 的封装,无需写 AppDelegate 和 AppKit 代码,就能快速创建菜单栏图标和下拉内容。

基本用法

@main
struct ImageSlimApp: App {
    
    @SceneBuilder
        var menuBarExtraScene: some Scene {
            if #available(macOS 13.0, *) {
                MenuBarExtra("我的图标", systemImage: "gearshape") {
                    Button("执行操作") {
                        print("点击了菜单项")
                    }
                    Divider()
                    Button("退出") {
                        NSApp.terminate(nil)
                    }
                }
            }
        }
    var body: some Scene {
        menuBarExtraScene
        WindowGroup {
            ContentView()
        }
    }
}

效果:

在右上角系统菜单栏出现一个 “⚙️” 图标;

点击图标后,弹出菜单;

菜单用 SwiftUI 构建,响应事件;

无需任何 AppKit 或 NSStatusItem 的写法。

参数详解

MenuBarExtra("标题", systemImage: "gearshape") {
    // 菜单栏弹出的内容(SwiftUI View)
}

“标题”:鼠标悬停时显示的文字(可以省略或设置为空)。

systemImage:SF Symbols 的图标名,用作菜单栏图标。

{}:SwiftUI 构建的菜单内容(可以是 Button, Text, Toggle 等)。

功能

1、自定义图标:使用 SF Symbols 或图像资源。

2、下拉菜单(动态 View):完全用 SwiftUI 构建。

3、可响应点击、切换、选项:像普通 View 一样响应。

4、状态持久化(可绑定 @State):可动态更新菜单项状态。

5、无需 AppDelegate / NSStatusItem:完全 SwiftUI 化。

更多配置

1、菜单开关

@State private var isOn = false
    
MenuBarExtra("状态工具", systemImage: "bolt.fill") {
    Toggle("启用功能", isOn: $isOn)
    Button("重载配置") {
        // 执行操作
    }
    Divider()
    Button("退出") {
        NSApp.terminate(nil)
    }
}

当绑定Toggle控件,开启Toggle时,状态栏菜单会显示勾选状态。

2、禁用菜单

MenuBarExtra("状态工具", systemImage: "bolt.fill") {
    Toggle("启用功能", isOn: $isOn)
    Button("重载配置") {
        // 执行操作
    }
    Divider()
    Button("退出") {
        NSApp.terminate(nil)
    }
    .disabled(true) // 禁用
}

3、自定义菜单图标

MenuBarExtra(content: {
    Button("执行操作") {
        print("点击了菜单项")
    }
    Divider()
    Button("退出") {
        NSApp.terminate(nil)
    }
}, label: {
    Image("templateIcon")
})

注意,图片应该使用模版图像(Template Image),用于适配浅色/深色模式。

关于模版图像的知识,可以阅读《macOS状态栏图标关键组件NSStatusItem》的注意事项部分。

MenuBarExtra vs NSStatusItem

1、macOS 支持版本:MenuBarExtra支持macOS 13+,NSStatusItem支持macOS 10.10+。

2、代码量:MenuBarExtra代码少,纯 SwiftUI,NSStatusItem相比之下多一点,可能还需要用到 AppDelegate进行状态控制。

3、自定义弹窗 UI:MenuBarExtra只能是菜单样式(列表),NSStatusItem可自定义为任意浮窗。

4、动画与行为控制:MenuBarExtra受限(系统菜单样式),NSStatusItem非常灵活。

5、适合快速开发:MenuBarExtra适合快速开发,NSStatusItem适合自定义悬浮窗口。

使用场景

使用 MenuBarExtra,适合开发:

1、小工具类 App(比如 Todo、切换器、快捷操作)

2、简单状态切换(开关 Wi-Fi、显示状态)

3、不需要复杂浮窗,只需要下拉菜单的功能

如果需要:

1、精确控制窗口位置

2、显示复杂 UI(输入框、图表)

3、像 Dropbox 一样弹出浮动小窗口

那么就该用 NSStatusItem。

总结

MenuBarExtra可以快速制作状态栏菜单,支持macOS13以上的系统。

如果需要支持macOS13以下的系统,或者自定义复杂的状态栏或状态栏浮窗,就需要使用NSStatusItem,

如果在macOS上同时启用MenuBarExtra和NSStatusItem,macOS13以上的系统显示MenuBarExtra,13以下的系统显示NSStatusItem。

相关文章

1、macOS顶部和上下文菜单NSMenu:https://fangjunyu.com/2025/06/23/macos%e9%a1%b6%e9%83%a8%e5%92%8c%e4%b8%8a%e4%b8%8b%e6%96%87%e8%8f%9c%e5%8d%95nsmenu/

2、macOS状态栏图标关键组件NSStatusItem:https://fangjunyu.com/2025/06/26/macos%e8%8f%9c%e5%8d%95%e6%a0%8f%e5%9b%be%e6%a0%87%e5%85%b3%e9%94%ae%e7%bb%84%e4%bb%b6nsstatusitem/

3、macOS单个菜单项类NSMenuItem:https://fangjunyu.com/2025/06/25/macos%e5%8d%95%e4%b8%aa%e8%8f%9c%e5%8d%95%e9%a1%b9%e7%b1%bbnsmenuitem/

4、macOS状态栏图标按钮类NSStatusBarButton:https://fangjunyu.com/2025/06/26/macos%e7%8a%b6%e6%80%81%e6%a0%8f%e5%9b%be%e6%a0%87%e6%8c%89%e9%92%ae%e7%b1%bbnsstatusbarbutton/

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注