2013-01-31 47 views
9

में होवर ओवर प्रभाव में मेरे पास NSCollectionView है जिसमें NSView एस है। NSView में NSBox है जो इसे चयनित होने पर रंग बदलता है। मैं NSBox रंग बदलते समय भी रंग बदलना चाहता हूं।एनएससीओलेक्शन व्यू

मैंने NSBox उपclassed और mouseEntered और mouseExited विधियों को जोड़ा। मैंने addTrackingRectviewWillMoveToWindow के अंदर उपयोग किया लेकिन समस्या यह है कि होवर प्रभाव केवल तभी होता है जब मैं पहले बॉक्स में मौजूद सबव्यूव का चयन करता हूं।

इसके अलावा केवल चयनित बॉक्स में होवर ओवर इफेक्ट हो रहा है। मैं होवर ओवर इफेक्ट को कैसे कार्यान्वित कर सकता हूं कि मेरे में सभी 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