2013-01-31 13 views
9

Ho un NSCollectionView con alcuni NSView s in esso. Lo NSView ha un NSBox che cambia colore quando è selezionato. Voglio anche fare in modo che il NSBox cambi colore quando si passa il mouse sopra.Effetto Hover Over in NSCollectionView

I sottoclasse NSBox e aggiunto i metodi mouseEntered e mouseExited. Ho utilizzato addTrackingRect all'interno di viewWillMoveToWindow ma il problema è che l'effetto di passaggio del mouse si verifica solo se prima seleziono la sottoview in cui si trova la casella.

Inoltre, solo la casella selezionata ha l'effetto Passare sopra sopra. Come posso implementare l'effetto Hover Over in modo che tutti gli NSView s nel mio NSCollectionView mostrino immediatamente l'effetto?

risposta

2

È possibile ignorare updateTrackingAreas in una sottoclasse di NSView per raggiungere questo comportamento:

interfaccia

@interface HoverView : NSView 

@property (strong, nonatomic) NSColor *hoverColor; 

@end 

Attuazione

@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