Может ли NSStatusItem быть сжатым?
У меня есть переменная длина NSStatusItem
, которую я хотел бы оставаться видимым, когда это было возможно, даже если это означает показ только некоторого содержимого, но когда мой элемент достаточно широк, чтобы работать в строке меню приложения, это полностью скрыто. Есть ли способ сказать, когда это произойдет, чтобы я мог скрыть представление, чтобы оно соответствовало доступному пространству?
Я экспериментировал с пользовательским представлением, переопределяя все методы viewWill*
, средства отображения кадров и методы отображения и периодически проверяя, перемещалось ли содержимое окна или скрывалось. Я не могу найти способ сказать, когда мой элемент слишком длинный.
Ответы
Ответ 1
Это зависит от того, может ли ваше приложение элемента статуса определять количество пунктов меню в строке меню OS X. Быстрый поиск по документации на Apple показывает, что для этого нет публичных API-интерфейсов, предоставляемых Apple. Насколько мне известно, нет и частных, доступных.
Поэтому я бы рекомендовал вместо этого сделать свой статусный элемент по умолчанию небольшим и развернуть при нажатии пользователем.
Edit:
На самом деле посмотрите на обсуждение здесь: действительно умный способ определить, скрыт ли ваш элемент статуса. Поэтому, как только вы обнаружите, что он скрыт, вы можете уменьшить его, чтобы он снова появился.
Ответ 2
Здесь приведен полный рабочий пример, основанный на обсуждении, на котором указано пустое7:
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];
}