在鼠标悬停时如何在自定义NSView中更改颜色?

时间:2014-06-05 16:38:18

标签: cocoa mouseevent nsview

这适用于使用Cocoa和Objective-C编写的Mac应用程序。

我有一个自定义的NSView类,它基本上用作按钮的集合并存储所选按钮的值。有点像NSSlider,它可以捕捉到刻度线但是带有按钮而不是滑块。左下图是它的样子。

现在我要做的是让鼠标移动到每个按钮上时,它会覆盖那个半透明蓝色的按钮,然后在点击它时就会停留在那里。我做了几次尝试,您可以在右侧图片中看到最新结果:

example example2

将鼠标悬停在所有按钮上后会发生这种情况。出于某种原因,它使用窗口的原点而不是在MyButtonView中绘制。而且,它不是半透明的。我还没有担心当鼠标离开矩形时重绘正常按钮,因为这部分还没有工作。

现在这里是相关的代码。

在MyButtonView类的initWithFrame方法中:

for (int i = 0; i < 12; i++) {
        yOrigin = kBorderSize + (buttonHeight * i) + (kSeparatorSize * i);
        NSRect newRect = { {xOrigin, yOrigin}, {buttonWidth, buttonHeight} };
        [buttonRectangles addObject:NSStringFromRect(newRect)];
        [self addTrackingRect:newRect owner:self userData:NULL assumeInside:NO];
    }

绘制蓝色矩形的方法:

- (void)mouseEntered:(NSEvent *)theEvent {
    NSRect rect = [[theEvent trackingArea] rect];
    [self drawHoverRect:rect withColor:hoverBlue];
}

- (void)drawHoverRect:(NSRect)rect withColor:(NSColor *)color {
    [color set];
    NSRectFill(rect);
    [self displayRect:rect];
}

我不知道该怎么做。我花了几个小时研究Apple的文档并且无法解决这个问题。显然,我不是Cocoa或Objective-C的老手,所以我会喜欢一些帮助。

1 个答案:

答案 0 :(得分:1)

您遇到的一个基本问题是您绕过了正常的绘图机制并尝试自己强制绘图。对于初学者来说,这是一个常见的错误。在继续之前,您应该阅读Apple的View Programming Guide: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaViewsGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40002978

如果您遇到问题,那么您可能需要备份并开始使用一些更基本的Objective-C / Cocoa指南和文档。

回到实际视图,在这个视图中你要做的一件事就是在drawRect:方法中完成所有绘图。您应该通过某种数据结构跟踪鼠标移动的状态,然后根据drawRect:方法中的数据结构进行绘制。你会打电话给

  

[self setNeedsDisplay:YES];

在您的鼠标跟踪方法中, 后,您已记录数据结构中发生的任何更改。如果您只想一次突出显示一个按钮,那么您的数据结构可以像NSInteger一样简单,其值设置为所选按钮的索引(或-1或任何表示没有选择的内容)。

为了便于学习,你的蓝框当前从窗口的原点绘制的原因是你在系统调用drawRect:时通常为你的视图设置的“上下文”之外调用绘图代码。该“上下文”将包括将当前原点移动到视图原点的转换,而不是窗口的原点。

相关问题