2013-01-31 113 views
9

我有一個NSCollectionView與其中幾個NSView s。 NSView中有一個NSBox,它在選擇時會改變顏色。我想在盤旋時改變顏色NSBox懸停在NSCollectionView效果

I subclassed NSBox並添加了mouseEnteredmouseExited方法。我在viewWillMoveToWindow的內部使用了addTrackingRect,但問題是僅當我首先選擇該框所在的子視圖時,纔會發生懸停結束效果。

此外,只有選中的框具有懸停覆蓋效果。我如何實現懸停效果,以便我的NSCollectionView中的所有NSView都能立即顯示效果?

回答

2

您可以在NSView子類中重寫updateTrackingAreas來完成此行爲:

接口

@interface HoverView : NSView 

@property (strong, nonatomic) NSColor *hoverColor; 

@end 

實施

@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