2013-01-31 115 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