Was bewirkt, dass eine weiße Grenze angewandt werden, um einen NSProgressIndicator im Systemmenü angezeigt?

StackOverflow https://stackoverflow.com/questions/2714951

Frage

Dies ist, was passiert, wenn ich eine NSProgressIndicator und NSStatusItem Methode der Nutzung -setView: es in der Menüleiste Bereich angezeigt werden, während ich eine Aktion bin ausführen:

Beispiel verkorksten NSProgressIndicator http://cl.ly/l9R/content

Was sind die Ursachen dieser Grenze angezeigt werden, und wie kann ich es entfernen? Das gewünschte Ergebnis ist, dass die Steuerung transparent sein.

Hier ist der Code verwende ich:

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];
War es hilfreich?

Lösung

Do skalieren, um die NSProgressIndicator nicht, obwohl es ist auch eine NSView. Erstellen Sie eine neue Ansicht, die feine, Position in dieser Ansicht der Statusanzeige ändert die Größe, und übergeben Sie den einschließenden Blick auf -[NSStatusItem setView:]. Hier ist meine Umsetzung.

In 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 {}
…

Ich habe eine benutzerdefinierte Methode, -[NSView center], das macht folgende:

@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

Andere Tipps

Ich habe gesehen, wie du das Problem gelöst Ich lasse dies ist eine Alternative zur Implementierung. Sie können verwenden ProgressHud .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top