2011-02-13 13 views
18

Tengo una longitud variable NSStatusItem que me gustaría permanecer visible siempre que sea posible, incluso si eso significa mostrar solo parte del contenido, pero cuando mi artículo es lo suficientemente ancho como para entrar en la barra de menú de una aplicación, está oculto por completo. ¿Hay alguna forma de saber cuándo sucede esto para poder reducir la vista y adaptarla al espacio disponible?¿Se puede reducir un NSStatusItem para que quepa?

Experimenté con una vista personalizada, anulando todos los métodos viewWill*, los configuradores de marcos y los métodos de visualización, y comprobando periódicamente si la ventana que los contiene se ha movido o se ha ocultado. No encuentro ninguna forma de saber cuándo mi artículo es demasiado largo.

+1

Si ayuda, nunca he visto una aplicación que lo haga. –

Respuesta

1

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 fin de hacer esto. Que yo sepa, tampoco hay privados disponibles.

Así que, en cambio, recomendaría que haga que su elemento de estado sea pequeño por defecto y se expanda cuando lo haga el usuario.

Editar: mirar realmente la discusión here: una manera muy inteligente para detectar si su elemento de estado se está ocultando. Entonces, una vez que haya detectado que está siendo oculto, puede reducirlo para que vuelva a aparecer.

+0

Esta es una recomendación razonable en general, y esta pregunta ha estado abierta tanto que dudo que haya una respuesta afirmativa. :) – alltom

+0

Acabo de notar su edición! ¡Muchas gracias! – alltom

1

Aquí está un ejemplo de trabajo completo basado en la discusión que hollow7 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 es conseguir que sigue siendo la ventana NSStatusItem. Hasta ahora, he encontrado dos métodos para obtenerlo.

1 - Hay un método privado llamado _window. Puede utilizarlo como esto:

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

2 - Este es un poco más complicado, pero creo que esto es más probable que pase el análisis estático de Apple para el uso del método privado en la Mac App Store:

Ajuste el objetivo y acción del NSStatusItem a un método de controlar, de esta manera:

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

luego acceder a la ventana en el método invocado:

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