2013-01-31 16 views
9

Mam NSCollectionView z kilkoma w nim. Model NSView ma kolor NSBox, który zmienia kolor po wybraniu. Chcę również zmienić kolor NSBox po obróceniu.Hover Over efekt w NSCollectionView

Podklasowałem NSBox i dodano metody mouseEntered i mouseExited. Kiedyś addTrackingRect wewnątrz viewWillMoveToWindow ale problemem jest to, że unoszą się nad efektem tylko się dzieje, jeśli najpierw wybrać podrzędny, że skrzynka jest w.

Ponadto tylko pole, które jest wybrany ma wpływ Najedź na nim dzieje. W jaki sposób mogę zaimplementować efekt Hover Over, tak aby wszystkie NSView w moim pokazać efekt natychmiast?

Odpowiedz

2

Można zastąpić updateTrackingAreas w podklasie NSView do osiągnięcia tego zachowania:

interfejsu

@interface HoverView : NSView 

@property (strong, nonatomic) NSColor *hoverColor; 

@end 

Realizacja

@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