MacOS 开发 - 状态栏 NSStatusBar & NSStatusItem

本文详细介绍如何在Mac上创建状态栏应用,包括初始化状态栏图标、设置提示文本、添加点击事件监听、集成弹出窗口(popover)及下拉菜单等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


简介

官方对菜单栏的解释:
在这里插入图片描述

开发上为了方便 喜欢直接叫左侧的 应用菜单 叫做菜单栏,右侧的 状态菜单 叫做状态栏。


创建和使用

1、在 AppDelegate.m 中持有这个变量。

@property (nonatomic,strong) NSStatusItem *statusItem; //必须应用、且强引用,否则不会显示。


2、在 applicationDidFinishLaunching 中初始化

  • 注意 length 应选择 NSSquareStatusItemLength,否则不显示。NSVariableStatusItemLength 用于自定义 statusItem, 见本文第 6 部分。
  • 状态栏高度为22,请注意图片尺寸。
  • setHighlightMode, YES-有高亮效果(蓝色背景色),NO - 点击时和没点击,没什么特别效果。
- (void)addStatusItem{
    
    //获取系统单例NSStatusBar对象
    NSStatusBar *statusBar = [NSStatusBar systemStatusBar];
    
    NSStatusItem *statusItem = [statusBar statusItemWithLength: NSSquareStatusItemLength];
    
    self.statusItem = statusItem;
    
    [statusItem setHighlightMode:YES];
    [statusItem setImage: [NSImage imageNamed:@"swift18"]]; //设置图标,请注意尺寸
    }

2.1 设置 toolTip

toolTip 为鼠标悬停在 item 上面时的提示文字
[statusItem setToolTip:@"这是一个 ToolTip"];

tooltip

tooltip 多文字时
tooltip 多文字


3、给 statusItem 添加监听 setAction

[statusItem setAction:@selector(statusOnClick:)];

- (void)statusOnClick:(NSStatusItem *)item{

    NSLog(@"statusOnClick ----- ");
 }

4、NSStatusBarButton & 给 statusItem 添加 popover

NSStatusItem 添加 popover

4.1 初始化 popOver
具体可参考:http://blog.csdn.net/lovechris00/article/details/77996141


@property(nonatomic,strong) NSPopover *firstPopover;
@property(nonatomic,strong) FirstViewController * firstVC;

- (NSPopover *)firstPopover
{
    if(!_firstPopover)
    {
        _firstPopover=[[NSPopover alloc]init];
        
        _firstPopover.appearance = [NSAppearance appearanceNamed:NSAppearanceNameAqua];
        
        _firstPopover.contentViewController = self.firstVC;
        _firstPopover.behavior = NSPopoverBehaviorTransient;
        
    }
    return _firstPopover;
}

- (FirstViewController *)firstVC
{
    if(!_firstVC)
    {
        _firstVC=[[FirstViewController alloc]init];
    }
    return _firstVC;
}

4.2 popover 弹出时,必须showRelativeToRect,我们无法获取 statusItem.bounds。
经过查看,statusItem 内部有个 .button,类型为 NSStatusBarButton,所以给这个 button 添加监听方法。

[statusItem.button setAction:@selector(statusButtonOnClick:)];

- (void)statusButtonOnClick:(NSButton *)btn{
    
    NSLog(@"statusButtonOnClick ----- ");
    
    [self.firstPopover showRelativeToRect:[btn bounds] ofView:btn preferredEdge:NSRectEdgeMaxY]; 
}

4.3 聪明的同学可能到这里会质疑,statusItemstatusItem.button 都绑定 action,那调用哪一个呢?
答:最先绑定的哪个,被后面那个覆盖。


5、添加NSMenu

NSStatusItem 添加 menu

5.1 初始化 menu
可参考博文:http://blog.csdn.net/lovechris00/article/details/78002161

 NSMenu *subMenu = [[NSMenu alloc] initWithTitle:@"Load_TEXT"];
    
    [subMenu addItemWithTitle:@"Load1"action:@selector(load1) keyEquivalent:@"E"];
    [subMenu addItemWithTitle:@"Load2"action:@selector(load2) keyEquivalent:@"R"];
    
- (void)load1{
    NSLog(@"load1 ---- ");
}

- (void)load2{
    NSLog(@"load1 ---- ");
}

5.2 绑定 NSStatusItem 和 menu

statusItem.menu = subMenu;

5.3 如果同时绑定 menu,有绑定 action 方法来调用 popover,会咋样?
答:经过测试,无论代码添加顺序,添加 menu成功,绑定两个 action都失败。不调用action 中的方法,也就不会弹出 popover。

6、自定义 item 样式 - setView

6.1 statusItemWithLength 的样式要改为 NSVariableStatusItemLength

6.2 初始化自定义的 view,并使用 setView 绑定。

NSView *customerView = [[NSView alloc]initWithFrame:NSMakeRect(0, 0, 30, 5)];
    customerView.wantsLayer = YES;
    customerView.layer.backgroundColor = [NSColor redColor].CGColor;
    [statusItem setView: customerView];

setView - NSVariableStatusItemLength

6.3 小结

  • 无论 customerView.size.height 设置为多少,都和状态栏等高。设置 width 有效。系统状态栏的高度最大为22。
  • 同时 setImagesetView , setView 有效。
  • 设置 setView 后,从前的绑定的 action 和 添加的 menu都无效。

7、只显示状态栏图标,隐藏dock图标和菜单:

在info.plist中添加 Application is agent (UIElement) 属性,并且设置为YES。


参考资料

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程乐园

请我喝杯伯爵奶茶~!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值