NSColorWell子类没有获取mouseMoved事件

时间:2009-08-02 09:35:35

标签: cocoa events subclass nsview custom-view

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

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

Custom viewness!
(来源:ryanballantyne.name

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

我想做到这一点,你可以用他们的把手拖动颜色井。当鼠标悬停在手柄上时,该行程的开始是将光标变为张开的手。可悲的是,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时,那个会被调用,所以至少有一些事件发生在我身上,而不是我想要的事件。

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:2)

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

请记住,1)跟踪rects具有与光标相同的奇怪行为w / r / t旋转视图,以及2)如果你的边界改变(不仅仅是你的框架),你可能需要重新建立你的跟踪矩形,所以保存跟踪rect的标签以便以后删除它。