文章目錄
- 簡介
- 建立和使用
-
- 1、在 AppDelegate.m 中持有這個變量。
- 2、在 applicationDidFinishLaunching 中初始化
-
- 2.1 設定 toolTip
- 3、給 statusItem 添加監聽 setAction
- 4、NSStatusBarButton & 給 statusItem 添加 popover
- 5、添加NSMenu
- 6、自定義 item 樣式 - setView
- 7、隻顯示狀态欄圖示,隐藏dock圖示和菜單:
- 參考資料
簡介
官方對菜單欄的解釋:

開發上為了友善 喜歡直接叫左側的
應用菜單
叫做菜單欄,右側的
狀态菜單
叫做狀态欄。
建立和使用
1、在 AppDelegate.m 中持有這個變量。
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
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
- 設定
後,從前的綁定的 action 和 添加的 menu都無效。setView
7、隻顯示狀态欄圖示,隐藏dock圖示和菜單:
在info.plist中添加
Application is agent (UIElement)
屬性,并且設定為YES。
參考資料
-
背靠背的微笑:自定義NSStatusBar的樣式
http://www.jianshu.com/p/1835656f0fec