2

我认为一张图片胜过一千个单词。

在此处输入图像描述

您在这张图片中看到的是NSBoxSubclass in a NSViewCollection。我将填充颜色设置为“选定的菜单项颜色”是界面生成器。

为什么颜色会这样?

编辑:阅读这篇 SO 帖子后,我发现我可能必须设置 setPatternPhase。但是如何/在哪里?

4

2 回答 2

1

“选定的菜单项颜色”模式设计用于“菜单高”项,看起来你的 NSBox 比模式高。

也就是说,您可以使用我的答案中的代码来处理模式阶段的起源,但我认为这对您没有任何好处,因为该模式对于您的 NSBox 来说不够高。

于 2013-01-23T22:57:41.057 回答
1

受到 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];
}
于 2013-01-23T23:46:08.943 回答