2013-01-31 4 views
9

Ich habe eine NSCollectionView mit ein paar NSView s drin. Die NSView hat eine NSBox darin, die Farbe ändert, wenn es ausgewählt ist. Ich möchte auch die NSBox Farbe ändern, wenn Sie darüber schwebte.Hover Over-Effekt in NSCollectionView

Ich unterteilte NSBox und fügte die mouseEntered und mouseExited Methoden hinzu. Ich benutzen addTrackingRect innerhalb von viewWillMoveToWindow aber das Problem ist, dass die Hover-over-Effekt tritt nur auf, wenn ich zuerst die subview auswählen, die das Feld in ist.

Weiters sind nur die Box, die den Hover Over-Effekt geschieht auf sie ausgewählt hat. Wie kann ich den Hover Over-Effekt so implementieren, dass alle NSView s in meinem NSCollectionView den Effekt sofort zeigen?

Antwort

2

Sie können updateTrackingAreas in einer Unterklasse von NSView außer Kraft setzen, dieses Verhalten zu erreichen:

Schnittstelle

@interface HoverView : NSView 

@property (strong, nonatomic) NSColor *hoverColor; 

@end 

Implementierung

@interface HoverView() 

@property (strong, nonatomic) NSTrackingArea *trackingArea; 
@property (assign, nonatomic) BOOL mouseInside; 

@end 

@implementation HoverView 

- (void) drawRect:(NSRect)dirtyRect { 
    [super drawRect:dirtyRect]; 

    // Draw a white/alpha gradient 
    if (self.mouseInside) { 
     [_hoverColor set]; 
     NSRectFill(self.bounds); 
    } 
} 


- (void) updateTrackingAreas { 
    [super updateTrackingAreas]; 

    [self ensureTrackingArea]; 
    if (![[self trackingAreas] containsObject:_trackingArea]) { 
     [self addTrackingArea:_trackingArea]; 
    } 
} 

- (void) ensureTrackingArea { 
    if (_trackingArea == nil) { 
     self.trackingArea = [[NSTrackingArea alloc] initWithRect:NSZeroRect 
                 options:NSTrackingInVisibleRect | NSTrackingActiveAlways | NSTrackingMouseEnteredAndExited 
                  owner:self 
                 userInfo:nil]; 
    } 
} 

- (void) mouseEntered:(NSEvent *)theEvent { 
    self.mouseInside = YES; 
} 

- (void) mouseExited:(NSEvent *)theEvent { 
    self.mouseInside = NO; 
} 

- (void) setMouseInside:(BOOL)value { 
    if (_mouseInside != value) { 
     _mouseInside = value; 
     [self setNeedsDisplay:YES]; 
    } 
} 


@end