我认为一张图片比千言万语好。
您在此图片中看到的是NSBox
中的NSViewCollection
子类。我将填充颜色设置为“选定菜单项颜色”是“界面”构建器。
为什么这样的颜色?
编辑:阅读this SO post后,我发现我可能需要设置setPatternPhase。但是如何/在哪里?
答案 0 :(得分:2)
受到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];
}
答案 1 :(得分:1)
“选定的菜单项颜色”模式设计用于“菜单高”项目,看起来你的NSBox比图案高。
也就是说,您可以使用来自my answer的代码来处理模式阶段原点,但我认为它对您没有任何好处,因为模式对于您的NSBox来说不够高。< / p>