2013-01-31 42 views
9

Tôi có một số NSCollectionView với một số ít NSView s trong đó. Các NSView có một NSBox trong đó thay đổi màu sắc khi nó được chọn. Tôi cũng muốn thay đổi màu NSBox khi di chuột qua.Di chuột qua hiệu ứng trong NSCollectionView

Tôi đã phân loại NSBox và thêm các phương thức mouseEnteredmouseExited. Tôi đã sử dụng addTrackingRect bên trong viewWillMoveToWindow nhưng vấn đề là hiệu ứng di chuột qua chỉ xảy ra nếu trước tiên tôi chọn chế độ xem phụ mà hộp đó đang ở.

Ngoài ra chỉ hộp được chọn có hiệu ứng Di chuột qua. Làm cách nào để triển khai hiệu ứng Di chuột qua sao cho tất cả các NSView s trong số NSCollectionView của tôi hiển thị hiệu ứng ngay lập tức?

Trả lời

2

Bạn có thể ghi đè lên updateTrackingAreas trong một lớp con của NSView để thực hiện hành vi này:

Interface

@interface HoverView : NSView 

@property (strong, nonatomic) NSColor *hoverColor; 

@end 

Thực hiện

@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 
Các vấn đề liên quan