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

SwiftUI MenuBarExtra能否在macOS菜单栏显示自定义动态视图?

用MenuBarExtra实现自定义菜单栏持续更新视图(macOS Swift)

完全可以用MenuBarExtra实现你想要的效果,无需局限于默认的图标+标签模式,下面是具体实现思路和代码示例:

  • 自定义菜单栏主视图:
    MenuBarExtra支持直接传入自定义SwiftUI视图作为菜单栏显示内容,而非仅依赖系统默认组件。你可以用Text、HStack组合多色标签,结合动态数据绑定实现实时更新。

  • 实现实时更新逻辑:
    通过@State、@Published配合ObservableObject管理动态数据(比如实时统计值、状态标识),当数据变化时,SwiftUI会自动刷新视图内容。

  • 示例代码:

    import SwiftUI
    
    // 数据模型,用于实时更新状态
    class StatusMonitor: ObservableObject {
        @Published var cpuUsage: Double = 0.0
        @Published var memoryUsage: Double = 0.0
    
        init() {
            // 模拟每秒更新一次数据
            Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in
                self.cpuUsage = Double.random(in: 0...100)
                self.memoryUsage = Double.random(in: 0...100)
            }
        }
    }
    
    @main
    struct CustomMenuBarApp: App {
        @StateObject private var monitor = StatusMonitor()
    
        var body: some Scene {
            MenuBarExtra("", systemImage: "") {
                // 点击菜单栏后弹出的上下文菜单内容
                Text("CPU: \(monitor.cpuUsage, specifier: "%.1f")%")
                Text("Memory: \(monitor.memoryUsage, specifier: "%.1f")%")
                Divider()
                Button("Quit") {
                    NSApplication.shared.terminate(nil)
                }
            }
            .menuBarExtraStyle(.window) // 核心:启用窗口模式以自定义菜单栏视图
            .frame(width: 180, height: 24) // 自定义菜单栏视图尺寸
            .background(Color.black)
            .overlay(
                HStack(spacing: 8) {
                    Text("CPU")
                        .foregroundColor(.green)
                    Text("\(monitor.cpuUsage, specifier: "%.1f")%")
                        .foregroundColor(monitor.cpuUsage > 80 ? .red : .white)
                    Text("MEM")
                        .foregroundColor(.blue)
                    Text("\(monitor.memoryUsage, specifier: "%.1f")%")
                        .foregroundColor(monitor.memoryUsage > 80 ? .red : .white)
                }
            )
        }
    }
    
  • 关键细节:

    • .menuBarExtraStyle(.window):这是实现自定义菜单栏视图的关键,默认.menu模式仅支持图标/文本,而.window模式允许完全自定义菜单栏显示内容。
    • 数据响应:通过@StateObject托管数据模型,定时器模拟实时数据更新,视图会自动响应数据变化刷新多色标签。
    • 样式定制:可自由设置背景色、文本颜色、布局结构,匹配iStat Menus这类工具的视觉风格。

需要注意,菜单栏视图尺寸不宜过大,要符合macOS菜单栏的视觉规范,避免影响用户体验。

内容的提问来源于stack exchange,提问作者trinity420

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 06:48:11