2010-04-26 7 views
5

Esto es lo que sucede cuando creo una NSProgressIndicator y use NSStatusItem's -setView: method para mostrar en el área de la barra de menú mientras estoy realizando una acción:¿Qué hace que se aplique un borde blanco a un NSProgressIndicator que se muestra en el menú del sistema?

Example of messed up NSProgressIndicator http://cl.ly/l9R/content

Lo que hace que esta frontera a visualizar, y cómo puedo quitar ¿eso? El resultado esperado es que el control sea transparente.

Aquí está el código que estoy usando:

NSProgressIndicator *progressIndicator = [[NSProgressIndicator alloc] init]; 

[progressIndicator setBezeled: NO]; 
[progressIndicator setStyle: NSProgressIndicatorSpinningStyle]; 
[progressIndicator setControlSize: NSSmallControlSize]; 
[progressIndicator sizeToFit]; 
[progressIndicator startAnimation: self]; 
[statusItem setView: progressIndicator]; // statusItem is an NSStatusItem instance 
... 
[statusItem setView: nil]; 
[progressIndicator stopAnimation: self]; 
[progressIndicator release]; 

Respuesta

6

no escalan el NSProgressIndicator aunque es también un NSView. Cree una nueva vista que cambie de tamaño, coloque el indicador de estado en esa vista y pase la vista adjunta al -[NSStatusItem setView:]. Aquí está mi implementación.

En NSStatusItem+AnimatedProgressIndicator.m,

- (void) startAnimation { 

    NSView *progressIndicatorHolder = [[NSView alloc] init]; 

    NSProgressIndicator *progressIndicator = [[NSProgressIndicator alloc] init]; 

    [progressIndicator setBezeled: NO]; 
    [progressIndicator setStyle: NSProgressIndicatorSpinningStyle]; 
    [progressIndicator setControlSize: NSSmallControlSize]; 
    [progressIndicator sizeToFit]; 
    [progressIndicator setUsesThreadedAnimation:YES]; 

    [progressIndicatorHolder addSubview:progressIndicator]; 
    [progressIndicator startAnimation:self]; 

    [self setView:progressIndicatorHolder]; 

    [progressIndicator center]; 

    [progressIndicator setNextResponder:progressIndicatorHolder]; 
    [progressIndicatorHolder setNextResponder:self]; 

} 

- (void) stopAnimation { 

    [self setView:nil]; 

} 

- (void) mouseDown:(NSEvent *) theEvent { 

    [self popUpStatusItemMenu:[self menu]]; 

} 

- (void) rightMouseUp:(NSEvent *) theEvent {} 
- (void) mouseUp:(NSEvent *) theEvent {} 
… 

he añadido un método personalizado, -[NSView center], que hace lo siguiente:

@implementation NSView (Centering) 

- (void) center { 

    if (![self superview]) return; 

    [self setFrame:NSMakeRect(

     0.5 * ([self superview].frame.size.width - self.frame.size.width), 
     0.5 * ([self superview].frame.size.height - self.frame.size.height), 

     self.frame.size.width, 
     self.frame.size.height 

    )]; 

} 

@end 
+0

¡Eso definitivamente funciona! El único problema es que ahora no se mostrará cuando haga algo más que mostrarlo y dejarlo: estoy ejecutando un NSTask mientras se muestra el indicador; ¿algunas ideas? –

+0

Volver a establecer el título ayuda. Esto es realmente un problema, y ​​la forma correcta de hacerlo sin problemas podría ser manejar todo en una vista personalizada, en lugar de confiar tanto en una vista personalizada como en las cosas predeterminadas de Cocoa. –

-2

que he visto que resolvió el problema voy a dejar que esto es una alternativa a tu implementación Puede usar ProgressHud.

Cuestiones relacionadas