2013-01-31 27 views
9

İçinde bir NSCollectionView var ve bir kaç NSView s içeriyor. NSView'un içinde, seçildiğinde rengi değiştiren bir NSBox vardır. Ayrıca, üzerine gelindiğinde NSBox renk değiştirmeyi de istiyorum.Vurgulama Etkisi NSCollectionView içinde

NSBox alt sınıfını oluşturdum ve mouseEntered ve mouseExited yöntemlerini ekledim. Ben viewWillMoveToWindowaddTrackingRect kullanılan ancak sorun ilk kutu içindedir subview seçerseniz etkisi üzerinde vurgulu sadece olanlardır.

Ayrıca üzerinde oluyor Hover Üzeri etkiye sahiptir seçildiğinde sadece kutusu. Hover Over efektini, NSCollectionView benim NSView s etkiyi hemen gösterecek şekilde nasıl uygulayabilirim?

cevap

2

Bu davranışı gerçekleştirmek için NSView bir alt sınıfta updateTrackingAreas geçersiz kılabilirsiniz:

Arabirimi

@interface HoverView : NSView 

@property (strong, nonatomic) NSColor *hoverColor; 

@end 

Uygulama

@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