文章目录
简介
官方对菜单栏的解释:
开发上为了方便 喜欢直接叫左侧的 应用菜单
叫做菜单栏,右侧的 状态菜单
叫做状态栏。
创建和使用
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 多文字时
3、给 statusItem 添加监听 setAction
[statusItem setAction:@selector(statusOnClick:)];
- (void)statusOnClick:(NSStatusItem *)item{
NSLog(@"statusOnClick ----- ");
}
4、NSStatusBarButton & 给 statusItem 添加 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 聪明的同学可能到这里会质疑,statusItem
和 statusItem.button
都绑定 action,那调用哪一个呢?
答:最先绑定的哪个,被后面那个覆盖。
5、添加NSMenu
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];
6.3 小结
- 无论 customerView.size.height 设置为多少,都和状态栏等高。设置 width 有效。系统状态栏的高度最大为22。
- 同时
setImage
和setView
,setView
有效。 - 设置
setView
后,从前的绑定的 action 和 添加的 menu都无效。
7、只显示状态栏图标,隐藏dock图标和菜单:
在info.plist中添加 Application is agent (UIElement)
属性,并且设置为YES。
参考资料
- 背靠背的微笑:自定义NSStatusBar的样式
http://www.jianshu.com/p/1835656f0fec