/ / NSMenu dentro de la clase NSView personalizada para NSStatusItem que no aparece en la parte inferior de la barra de estado - objectivo-c, macos, cacao

NSMenu dentro de la clase NSView personalizada para NSStatusItem que no aparece en la parte inferior de la barra de estado: object-c, macos, cacao

Creé una clase de vista personalizada porque quería tener un elemento de estado al que pudiera arrastrar elementos.

Aquí está la definición de la vista:

@interface DragStatusView : NSImageView <NSMenuDelegate>{
BOOL highlight;
}
@end

En mi ApplicationDelegate.m Tengo una instancia de NSStatusItem y una instancia de mi DragStatusView. Configuré la imagen en DragStatusView, y también configuré su menú en una instancia de NSMenu que contiene algunos NSMenuItems.

- (void)applicationDidFinishLaunching:(NSNotification *)notification
{
// Install icon into the menu bar
statusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength] retain];

NSImage *statusImage = [NSImage imageNamed:@"Status"];
[statusItem setImage:statusImage];




[menuItem setTitle:NSLocalizedString(@"Special Status", @"imgur menu item text")];
CGFloat itemHeight = [[NSStatusBar systemStatusBar] thickness];
NSRect itemRect = NSMakeRect(0.0, 0.0, NSSquareStatusItemLength, itemHeight);

DragStatusView* dragView = [[DragStatusView alloc] initWithFrame:itemRect];
[dragView retain];

[dragView setImage:statusImage];
[dragView setMenu:menu];

[statusItem setHighlightMode:YES];
[statusItem setView:dragView];
}

Aquí está el método en el controlador DragStatusView que activa el menú para que aparezca:

- (void)mouseDown:(NSEvent *)event {
[[[NSApp delegate] statusItem] popUpStatusItemMenu:[self menu]]; // or another method that returns a menu
}

Esto funciona principalmente, sin embargo, el menú aparece demasiado alto al hacer clic en el elemento de estado.

Cómo se ve antes de hacer clic: http://imgur.com/fpJcd,quS3c#1

Cómo se ve después de hacer clic: http://imgur.com/fpJcd,quS3c#0 (el menú aparece en la parte superior de la pantalla - ¡ahh!)

¿Cómo puedo hacer que el menú aparezca en la parte inferior de la barra de estado?

¡Gracias!

Respuestas

1 para la respuesta № 1

¿Cómo estás apareciendo el menú? Lo que quieres hacer es algo como esto:

- (void)mouseDown:(NSEvent *)event {
[statusItem popUpStatusItemMenu:[self menu]];
}

Por supuesto, su vista necesitará una referencia al elemento de estado, entonces.


1 para la respuesta № 2

Finalmente lo puse en funcionamiento.

El código se puede ver aquí:

https://github.com/zbuc/imgurBar/blob/master/imgur/ApplicationDelegate.m https://github.com/zbuc/imgurBar/blob/master/imgur/StatusItemView.m

Sin embargo, no estoy muy seguro de por qué funciona este código, lo que me hace sentir incómodo. Hace cosas con los rectificadores de límites de manera ligeramente diferente, pero no veo qué hace exactamente esto ahora.