Можно ли уменьшить размер элемента NSStatusItem? - PullRequest
18 голосов
/ 14 февраля 2011

У меня есть переменная длина NSStatusItem, которую я бы хотел, чтобы она оставалась видимой всякий раз, когда это возможно, даже если это означает отображение только некоторого содержимого, но когда мой элемент достаточно широк, чтобы попасть в строку меню приложения, это полностью скрыт Есть ли способ определить, когда это произойдет, чтобы я мог уменьшить вид до размера доступного пространства?

Я экспериментировал с пользовательским представлением, переопределяя все методы viewWill*, установщики фреймов и методы отображения, и периодически проверял, перемещалось ли содержащее окно или становилось скрытым. Я не могу найти способ узнать, когда мой товар слишком длинный.

Ответы [ 2 ]

1 голос
/ 28 января 2014

Вот полный рабочий пример, основанный на обсуждении, на которое ссылается hollow7:

self.statusItem.title = @"Message that will be truncated as necessary.";
while (self.statusItem.title.length > 0) {
    CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenAboveWindow, (CGWindowID)self.statusItemWindow.windowNumber);
    if (CFArrayGetCount(windowList) > 1) {
        CFRelease(windowList);
        self.statusItem.title = [self.statusItem.title substringToIndex:self.statusItem.title.length - 1];
    } else {
        CFRelease(windowList);
        break;
    }
}

Остается сложная часть - получить окно NSStatusItem.До сих пор я нашел два метода для его получения.

1 - есть частный метод с именем _window.Вы можете использовать его следующим образом:

self.statusItemWindow = [self.statusItem performSelector:@selector(_window)];

2 - это немного сложнее, но я думаю, что с большей вероятностью пройдет статический анализ Apple для частного использования в Mac App Store:

Установите цель и действие NSStatusItem для метода, которым вы управляете, например:

self.statusItem.target = self;
self.statusItem.action = @selector(itemClicked:);

Затем откройте окно в вызванном методе:

- (void)itemClicked:(id)sender {
    self.statusItemWindow = [[NSApp currentEvent] window];
}
1 голос
/ 16 ноября 2011

Это зависит от того, может ли ваше приложение элемента состояния определить количество пунктов меню в строке меню OS X.Быстрый поиск в документации Apple показывает, что Apple не предоставляет общедоступных API для этой цели.Насколько мне известно, нет доступных личных.

Поэтому я бы порекомендовал вместо этого по умолчанию сделать ваш элемент статуса маленьким и расширенным при нажатии пользователем.

Редактировать* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * : действительно умный способ определить, скрыт ли ваш статус.Поэтому, как только вы обнаружили, что он скрыт, вы можете уменьшить его, чтобы он появился снова.

...