我认为一张图片胜过一千个单词。
您在这张图片中看到的是NSBox
Subclass in a NSViewCollection
。我将填充颜色设置为“选定的菜单项颜色”是界面生成器。
为什么颜色会这样?
编辑:阅读这篇 SO 帖子后,我发现我可能必须设置 setPatternPhase。但是如何/在哪里?
我认为一张图片胜过一千个单词。
您在这张图片中看到的是NSBox
Subclass in a NSViewCollection
。我将填充颜色设置为“选定的菜单项颜色”是界面生成器。
为什么颜色会这样?
编辑:阅读这篇 SO 帖子后,我发现我可能必须设置 setPatternPhase。但是如何/在哪里?
“选定的菜单项颜色”模式设计用于“菜单高”项,看起来你的 NSBox 比模式高。
也就是说,您可以使用我的答案中的代码来处理模式阶段的起源,但我认为这对您没有任何好处,因为该模式对于您的 NSBox 来说不够高。
受到 Smilin Brian 解决方案的启发,我想出了这个:
-(void) drawRect: (NSRect)dirtyRect
{
[super drawRect:dirtyRect];
if(mouseOver) {
[NSGraphicsContext saveGraphicsState];
CGFloat yOffset = NSMaxY([self convertRect:self.bounds toView:nil]);
CGFloat xOffset = NSMinX([self convertRect:self.bounds toView:nil]);
[[NSGraphicsContext currentContext] setPatternPhase:NSMakePoint(xOffset, yOffset)];
[[NSColor selectedMenuItemColor ] setFill];
NSRectFill(dirtyRect);
[NSGraphicsContext restoreGraphicsState];
}
}
目前它只处理 mouseOver 事件而不是选择,但它几乎相同。
只是为了那些可能需要我使用的 NSBox 的人:
- (void)awakeFromNib{
NSTrackingArea* trackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds
options: (NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow )
owner:self userInfo:nil];
[self addTrackingArea:trackingArea];
}
和
- (void)mouseEntered:(NSEvent *)theEvent {
mouseOver = true;
[self setNeedsDisplayInRect:self.bounds];
[self needsDisplay];
}
- (void)mouseExited:(NSEvent *)theEvent {
mouseOver= false;
[self setNeedsDisplayInRect:self.bounds];
[self needsDisplay];
}