11

私はそれNSCollectionViewにいくつかNSViewの s を持っています。にNSViewは、NSBox選択すると色が変わる があります。NSBoxホバーしたときに色も変えたいです。

andメソッドをサブクラス化NSBoxして追加しました。内部で使用しましたが、問題は、ボックスがあるサブビューを最初に選択した場合にのみホバーオーバー効果が発生することです。mouseEnteredmouseExitedaddTrackingRectviewWillMoveToWindow

さらに、選択されたボックスのみにホバー オーバー効果が発生します。NSViewホバー オーバー エフェクトを実装して、すべての がNSCollectionViewすぐにエフェクトを表示するようにするにはどうすればよいですか?

4

2 に答える 2

5

updateTrackingAreasのサブクラスでオーバーライドして、NSViewこの動作を実現できます。

インターフェース

@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
于 2016-03-07T04:42:41.680 に答える