天天看點

MacOS 開發 - 狀态欄 NSStatusBar & NSStatusItem簡介建立和使用參考資料

文章目錄

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

簡介

官方對菜單欄的解釋:

MacOS 開發 - 狀态欄 NSStatusBar & NSStatusItem簡介建立和使用參考資料

開發上為了友善 喜歡直接叫左側的

應用菜單

叫做菜單欄,右側的

狀态菜單

叫做狀态欄。

建立和使用

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"];

MacOS 開發 - 狀态欄 NSStatusBar & NSStatusItem簡介建立和使用參考資料

tooltip 多文字時

MacOS 開發 - 狀态欄 NSStatusBar & NSStatusItem簡介建立和使用參考資料

3、給 statusItem 添加監聽 setAction

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

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

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

           

4、NSStatusBarButton & 給 statusItem 添加 popover

MacOS 開發 - 狀态欄 NSStatusBar & NSStatusItem簡介建立和使用參考資料

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

MacOS 開發 - 狀态欄 NSStatusBar & NSStatusItem簡介建立和使用參考資料

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];
           
MacOS 開發 - 狀态欄 NSStatusBar & NSStatusItem簡介建立和使用參考資料

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