gpt4 book ai didi

objective-c - NSCollectionView 中的悬停效果

转载 作者:太空狗 更新时间:2023-10-30 03:26:42 33 4
gpt4 key购买 nike

我有一个 NSCollectionView,里面有一些 NSViewNSView 中有一个 NSBox,当它被选中时会改变颜色。我还想让 NSBox 在悬停时改变颜色。

我继承了 NSBox 并添加了 mouseEnteredmouseExited 方法。我在 viewWillMoveToWindow 中使用了 addTrackingRect,但问题是悬停效果只有在我首先选择框所在的 subview 时才会发生。

此外,只有选中的方框才会出现悬停效果。如何实现悬停效果,以便我的 NSCollectionView 中的所有 NSView 立即显示该效果?

最佳答案

您可以在 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

关于objective-c - NSCollectionView 中的悬停效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14635933/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com