título titulo keywords etiquetas etiqueta description cocoa macos nsstatusitem

cocoa - titulo - meta title seo



¿Se puede reducir un NSStatusItem para que quepa? (2)

Tengo un NSStatusItem longitud variable que me gustaría permanecer visible siempre que sea posible, incluso si eso significa mostrar solo parte del contenido, pero cuando mi elemento es lo suficientemente ancho como para ejecutarlo en la barra de menús de una aplicación, se oculta por completo. ¿Hay alguna forma de saber cuándo ocurre esto para poder reducir la vista y ajustar el espacio disponible?

He experimentado con una vista personalizada, anulando todos los métodos viewWill* , los viewWill* cuadros y los métodos de visualización, y verificando periódicamente si la ventana que contiene se ha movido o se ha ocultado. No puedo encontrar ninguna manera de saber cuándo mi artículo es demasiado largo.


Aquí hay un ejemplo completo de trabajo basado en la discusión a la que hollow7 hizo referencia:

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; } }

Una parte difícil que queda es obtener la ventana NSStatusItem. Hasta ahora, he encontrado dos métodos para obtenerlo.

1 - Hay un método privado llamado _window . Puedes utilizarlo así:

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

2 - Esto es un poco más complicado, pero creo que es más probable que pase el análisis estático de Apple para el uso de métodos privados en la Mac App Store:

Establezca el objetivo y la acción de NSStatusItem en un método que controle, como este:

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

Luego accede a la ventana en el método invocado:

- (void)itemClicked:(id)sender { self.statusItemWindow = [[NSApp currentEvent] window]; }


Esto depende de si su aplicación de elemento de estado puede detectar el número de elementos de menú en la barra de menús de OS X. Una búsqueda rápida a través de la documentación de Apple muestra que no hay API públicas proporcionadas por Apple con el propósito de hacer esto. Que yo sepa, no hay privados también disponibles.

Por lo tanto, recomendaría que haga que su elemento de estado sea pequeño por defecto y se expanda cuando el usuario haga clic en él.

Edición: en realidad, mire la discusión here : una manera realmente inteligente de detectar si su elemento de estado se está ocultando. Así que una vez que haya detectado que se está ocultando, puede reducirlo para que vuelva a aparecer.