Как сделать приложение Menubar с NSPopover? - PullRequest
20 голосов
/ 20 октября 2011

Я видел много приложений с Элементом Menubar или приложений только с интерфейсом Menubar.

В Интернете есть несколько уроков и материалов, показывающих, как этого добиться. Но дело в том, что в них есть только кликабельные индексные строки.

Я бы хотел, чтобы NSPopover появлялся при щелчке по значку / элементу меню. Кто-нибудь знает, как это сделать?

1 Ответ

58 голосов
/ 26 октября 2011

Я не знаю, можно ли это сделать с помощью стандартного элемента строки состояния.Используя настраиваемое представление для меню, это относительно просто.

Создание элемента строки состояния с настраиваемым представлением:

item = [[NSStatusBar systemStatusBar] statusItemWithLength:thickness];
view = [[CustomView alloc] initWithFrame:(NSRect){.size={thickness, thickness}}];
[item setView:view];        

Ваше настраиваемое представление должно обнаруживать щелчки мыши:

- (void)mouseDown:(NSEvent *)event {
   ...
}

И, наконец, в какой-то момент после обнаружения щелчка мышью, показать / скрыть всплывающее окно.

if (/* menulet is active */) {
    [popover showRelativeToRect:/* menulet view frame */
                         ofView:/* menulet view */
                  preferredEdge:NSMinYEdge];
} else {
    [popover performClose:nil];
}

Вам нужен бит NSWindow Swizzling , чтобы заставить текстовые поля работать внутривсплывающее окно.

Я подготовил минимальный проект Xcode с этими идеями и небольшим количеством клея: PopoverMenulet .

...