Подтвердить что ты не робот

Может ли NSStatusItem быть сжатым?

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

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

4b9b3361

Ответ 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];
}