MacOS 开发 - 状态栏 NSStatusBar & NSStatusItem

版权声明:本文为博主原创文章,转载请附上本文链接地址。from : https://blog.csdn.net/lovechris00 https://blog.csdn.net/lovechris00/article/details/78011718


简介

状态栏(systemStatusBar)指电脑右上方的区域,这里可以看到日期、音量等 icon。
一个应用在状态栏可以设置一个 item(NSStatusItem *)。


创建和使用

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。


参考资料

阅读更多 登录后自动展开

扫码向博主提问

lovechris00

博客专家

爱拼才会赢
  • 擅长领域:
  • iOS
  • macOS
去开通我的Chat快问
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页