2010-11-29 12 views
1

Gibt es eine Möglichkeit, ein NSImageView mit der Standard-Hervorhebungsfarbe des Macs zu "markieren"? Ich bin einfach auf der Suche nach einer Möglichkeit, meine nsimageview zu tönen, so dass der Benutzer das Objekt leicht identifizieren kann.Markieren Sie NSImageView - Objective-c

Danke,

Kevin

Antwort

7

Wenn einer der eingebauten Optionen von NSImageView nicht ausreichend ist, Sie NSImageView Unterklasse könnte, und in drawRect, tun:

- (void)drawRect:(NSRect)frame { 
    [super drawRect:frame]; // this takes care of image 
    [NSBezierPath setDefaultLineWidth:4.0]; 
    [[NSColor highlightColor] set]; 
    [NSBezierPath strokeRect:frame]; // will give a 2 pixel wide border 
} 

Ahh, Um es als variablen Zustand zu haben, würde ich wahrscheinlich eine Instanzvariable definieren, zum Beispiel isHighlighted, um diesen Zustand zu verfolgen. Wenn dann irgendetwas passiert, das den hervorgehobenen Status ändert, wird die Ansicht so eingestellt, dass sie erneut angezeigt werden muss. Sie könnten dies in der Menge tun/get-Methoden zum Beispiel:

- (void)setHighlighted:(BOOL)aHighlighted { 
    isHighlighted = aHighlighted; 
    [self setNeedsDisplay:YES]; 
} 

Dann aktualisieren Sie Ihre drawRect: Methode Berücksichtigung der isHighlighted Flagge zu nehmen. Wie Sie ein nicht hervorgehobenes Aussehen erzielen, hängt vom Stil der Bildansicht ab. Sie könnten versuchen, einfach super zu rufen, um die Zeichnung zu machen, aber wenn Sie testen, sehen Sie irgendwelche übrig gebliebenen oder streunenden hervorgehobenen Pixelinformationen, die Super's Zeichnung nicht überschrieben hat, möchten Sie vielleicht zuerst eine klare Farbe zeichnen und dann super aufrufen.

So etwas wie folgt aus:

- (void)drawRect:(NSRect)frame { 
    isHighlighted ? [[NSColor highlightColor] set] : [[NSColor clearColor] set]; 
    [NSBezierPath setDefaultLineWidth:4.0]; 
    if (isHighlighted) { 
     [super drawRect:frame]; 
     [NSBezierPath strokeRect:frame]; // will give a 2 pixel wide border 
    } else { 
     [NSBezierPath fillRect:frame]; 
     [super drawRect:frame]; 
    } 
} 
+0

Wie kann ich un-Highlight das? – lab12

+0

Ich denke [super drawFrame: frame]; hätte sein sollen [super drawRect: frame]; – pixel