MacOS 开发 - 状态栏 NSStatusBar & NSStatusItem

标签: tooltip StatusBar StatusItem popover menu
1090人阅读 评论(0) 收藏 举报
分类:


简介

状态栏(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。


参考资料

查看评论

Mac OS X NSStatusItem图标添加

Mac OS X开发者都会碰到NSStatusItem图标的问题,但是NSStatusItem不是Mac App必须要使用的东西,但是使用NSStatusItem可以把一些简单的拓展功能放到这里。 ...
  • henanzhg
  • henanzhg
  • 2017-04-24 15:26:34
  • 616

Mac NSStatusBar

先看NSStatusBar 效果图然后再展开对NSStatusBar的使用。 首先声明一个NSStatusItem。@property (retain, strong) NSStatusItem *...
  • tongwei117
  • tongwei117
  • 2017-05-04 19:06:26
  • 493

MAC NSPopover

下面通过NSStatusBar出发 NSPopver。 创建 NSStatusBar//获取系统单例NSStatusBar对象 NSStatusBar *statusBar = [NSSta...
  • tongwei117
  • tongwei117
  • 2017-05-05 10:53:06
  • 506

使用Swift开发一个MacOS的菜单状态栏App

这两天突然想看看OSX下的App开发,看了几篇文章。下面这一篇我觉得入门是非常好的。我仅转述为中文,并非原文翻译。原文地址:http://footle.org/WeatherBar/ 下面开始介绍如...
  • yanghuiliu
  • yanghuiliu
  • 2016-07-28 12:11:46
  • 7404

MacOS的菜单状态栏App添加饼型进度

使用swift如何开发一个MacOS的状态栏App,上一篇已经讲了。里面我忘记提如何修改状态icon为饼型进度。比如App在处理什么事情的时候,可以添加进度状态提示用户。如下图所示: /// 显示状...
  • yanghuiliu
  • yanghuiliu
  • 2016-07-30 22:08:41
  • 1832

osx 代码创建自定义NSMenu & NSMenuItem

// unichar arrowKey = 'r'; NSString *refresh = [NSString stringWithCharacters:&arrowKey leng...
  • Jason_chen13
  • Jason_chen13
  • 2017-06-19 17:29:31
  • 923

MacOS 开发 - 状态栏 NSStatusBar & NSStatusItem

简介 创建和使用 1在 AppDelegatem 中持有这个变量 2在 applicationDidFinishLaunching 中初始化 1 设置 toolTip 3给 statusItem 添加...
  • lovechris00
  • lovechris00
  • 2017-09-17 17:20:31
  • 1090

Mac 随意记录

状态栏添加图标 在系统的菜单栏上添加App的图标 NSStatusItem *_statusItem = [[NSStatusBarsystemStatusBar] statusItemWi...
  • u014600626
  • u014600626
  • 2017-02-23 15:22:37
  • 399

ios开发笔记--状态栏的自定义,隐藏

iOS7 StatusBar 在需要隐藏或改变样式时在UIViewConroller中调用: [self setNeedsStatusBarAppearanceUpdate]; 1、隐藏 ...
  • hopedark
  • hopedark
  • 2013-11-15 09:53:52
  • 6585

MacOS 开发 - NSMenu 添加菜单栏

添加顶部目录 简单常用的一级目录 添加二三级目录 添加 Dock 菜单 状态栏NSStatusItem添加菜单 给一个NSView添加右击菜单 小结 参考资料添加顶部目录简单常用的一级目录- (voi...
  • lovechris00
  • lovechris00
  • 2017-09-16 11:14:13
  • 2907
    博客专栏
    交流互动
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 23万+
    积分: 3895
    排名: 1万+
    最新评论