cocoa - NSColorWell 子类未获取 mouseMoved 事件

标签 cocoa events subclass nsview custom-view

我正在尝试在我的 Cocoa 应用程序中实现颜色选择器。 (是的,我知道 NSColorPanel。我不太喜欢它。滚动我自己的目的是我认为我可以做得更好。)

这是我的选择器当前状态的图片。

Custom viewness!
(来源:ryanballantyne.name)

色轮周围的井是 NSColorWell 子类。它们以编程方式实例化,并通过在色轮类上调用 addSubView 添加到色轮 View (NSView 子类)。

我想让你可以通过它们的 handle 拖动颜色井。该旅程的开始是,当鼠标悬停在 handle 上时,光标变为张开的手。可悲的是,I can't use a cursor rect for this because most of my views are rotated 。因此,我必须使用 mouseMoved 事件并自己进行点击检测。

这是我正在尝试工作的鼠标事件代码:

- (void)mouseMoved:(NSEvent*)event
{
    NSLog(@"I am over here!\n");

    [super mouseMoved:event];

    NSPoint eventPoint = [self convertPoint:[event locationInWindow] fromView:nil];
    BOOL isInHandle = [grabHandle containsPoint:eventPoint];
    if (isInHandle && [NSCursor currentCursor] != [NSCursor openHandCursor])  {
        [[NSCursor openHandCursor] push];
    }
    else if (!isInHandle)  [NSCursor pop];
}

- (void)mouseEntered:(NSEvent*)event
{
    [[self window] setAcceptsMouseMovedEvents:YES];
}
- (void)mouseExited:(NSEvent*)event
{
    [[self window] setAcceptsMouseMovedEvents:NO];
    [NSCursor pop];
}

- (BOOL)acceptsFirstResponder
{
    return YES;
}
- (BOOL)resignFirstResponder
{
    return YES;
}

我发现我的 mouseMoved 方法从未被调用。进入和退出也是如此。然而,当我实现 mouseDown 时,那个确实会被调用,所以至少有一些事件发生在我身上,只是不是我想要的事件。

有什么想法吗?谢谢!

最佳答案

mouseEntered: 和 mouseExited: 不直接跟踪进入/退出 View ;它们会跟踪进入/退出您在 View 中建立的任何跟踪区域。相关方法是 -addTrackingRect:owner:userData:assumeInside:-removeTrackingRect:。如果您希望跟踪整个 View ,只需将 [selfbounds] 作为第一个参数即可。如果您的应用仅限 10.5+,您可能应该使用 NSTrackingArea,因为它直接支持仅在跟踪区域内获取鼠标移动事件。

请记住,1)跟踪矩形与旋转 View 的光标矩形具有相同的有点奇怪的行为,2)如果您的边界发生变化(不仅仅是您的框架),您可能需要重新建立您的跟踪矩形,因此请保存跟踪矩形的标签以便稍后将其删除。

关于cocoa - NSColorWell 子类未获取 mouseMoved 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1218527/

相关文章:

iphone - 为什么我应该在应用程序退出之前释放(并因此释放)对象?

objective-c - 每个 CPU 内核处于 C0 电源状态的时间

ios - SDL 2.0 iOS - 未收到触摸事件

events - 在不触发Sencha Touch的 "change"事件的情况下设置numberfield的值

java - 使用 Guice、枚举和静态工厂方法设计工厂框架

swift - 如何子类化 SKScene

cocoa - NSPopUpButton 箭头颜色

iOS 字符串文件冲突 - 源语言中的相同字符串,目标语言中的不同

Java在不相关的类之间创建事件

python - 从 Python 中的基类导入子类