1

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

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

自定义视野!
(来源:ryanballantyne.name

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

我想这样做,以便您可以通过它们的把手拖动颜色井。当鼠标悬停在手柄上时,该旅程的开始是使光标变为张开的手。可悲的是,我不能为此使用光标矩形,因为我的大部分视图都是旋转的。因此,我必须使用 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 时,确实会调用那个,所以至少有一些事件会影响到我,而不是我想要的事件。

有任何想法吗?谢谢!

4

1 回答 1

2

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

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

于 2009-08-02T13:30:21.343 回答