所选菜单项颜色未对齐?

时间:2013-01-23 09:05:47

标签: objective-c cocoa nscollectionview nscolor nsbox

我认为一张图片比千言万语好。

enter image description here

您在此图片中看到的是NSBox中的NSViewCollection子类。我将填充颜色设置为“选定菜单项颜色”是“界面”构建器。

为什么这样的颜色?

编辑:阅读this SO post后,我发现我可能需要设置setPatternPhase。但是如何/在哪里?

2 个答案:

答案 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>