这是针对使用 Cocoa 和 Objective-C 编写的 Mac 应用程序。
我有一个自定义 NSView 类,它本质上用作按钮集合并存储所选按钮的值。有点像 NSSlider,它会捕捉到刻度线,但使用按钮而不是 slider 。左下图就是它的样子。
现在我想做的是,当鼠标移动到每个按钮上时,它会用半透明的蓝色覆盖该按钮,然后在单击该按钮时将其保留在那里。我做了一些尝试,您可以在右图中看到最新的结果:
这是将鼠标悬停在所有按钮上后发生的情况。由于某种原因,它使用窗口的原点进行绘制,而不是在 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];
}
我不知道该怎么做。我已经仔细研究了苹果的文档几个小时,但无法弄清楚。显然,我不是 Cocoa 或 Objective-C 的老手,所以我希望得到一些帮助。
最佳答案
您遇到的一个基本问题是您绕过了正常的绘图机制并尝试自己强制绘图。对于初学者来说,这是一个常见的错误。在继续之前,您应该阅读 Apple 的 View 编程指南: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaViewsGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40002978
如果您在这方面遇到困难,那么您可能需要备份并从一些更基本的 Objective-C/Cocoa 指南和文档开始。
回到您的实际 View ,在此 View 中您必须做的一件事是在 drawRect: 方法中完成所有绘图。您应该通过某种数据结构跟踪鼠标移动的状态,然后在您的drawRect:方法中根据该数据结构进行绘制。您将调用
[self setNeedsDisplay:YES];
在您的鼠标跟踪方法中,在您记录了数据结构中发生的任何变化。如果您只想一次绘制一个突出显示的按钮,那么您的数据结构可以像 NSInteger 一样简单,您将其值设置为所选按钮的索引(或 -1 或其他表示不选择的值)。
为了学习,您的蓝色框当前从窗口的原点绘制的原因是您在系统调用drawRect:时通常为您的 View 设置的“上下文”之外调用绘制代码。该“上下文”将包括将当前原点移动到 View 原点的翻译,而不是窗口的原点。
关于cocoa - 如何使自定义 NSView 中的按钮在鼠标悬停时改变颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24065658/