【问题标题】:How do I make a button in a custom NSView change color on mouseover?如何在鼠标悬停时使自定义 NSView 中的按钮更改颜色?
【发布时间】:2014-07-26 18:27:44
【问题描述】:

这是一个使用 Cocoa 和 Objective-C 编写的 Mac 应用程序。

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

现在我想做的是,当鼠标移到每个按钮上时,它会用半透明的蓝色覆盖该按钮,然后单击它时会停留在那里。我做了几次尝试,你可以在右图中看到最新的结果:

这是在将鼠标悬停在所有按钮上之后发生的情况。由于某种原因,它使用窗口的原点进行绘制,而不是在 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 的老手,所以我希望得到一些帮助。

【问题讨论】:

    标签: cocoa mouseevent nsview


    【解决方案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: 时通常为视图设置的“上下文”之外调用绘制代码。该“上下文”将包括将当前原点移动到视图原点而不是窗口原点的翻译。

    【讨论】:

    • 感谢 harrisg,我能够让它完全按照我的意愿工作。
    猜你喜欢
    • 2017-11-29
    • 2012-08-16
    • 2016-12-11
    • 2018-05-25
    • 2018-07-20
    • 2013-09-10
    • 2021-11-21
    • 2012-08-21
    相关资源
    最近更新 更多