【问题标题】:NSColorWell subclass not getting mouseMoved eventsNSColorWell 子类没有得到 mouseMoved 事件
【发布时间】:2009-08-02 09:35:34
【问题描述】:

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

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


(来源:ryanballantyne.name

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

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

有什么想法吗?谢谢!

【问题讨论】:

  • 为什么不创建一个 NSColorPicker 子类?然后,您的选择器不仅可以添加到现有的颜色面板而不是丢弃其功能,而且如果您愿意,您甚至可以将其导出为插件,以便用户可以在任何应用程序中使用您出色的颜色选择器。
  • 我已经考虑在未来的版本中这样做。首先,我需要向自己证明,我对更好的颜色选择器的想法将会成功。

标签: cocoa events subclass nsview custom-view


【解决方案1】:

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

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

【讨论】:

  • 感谢有关 NSTrackingArea 的提示;我一定会去看看的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多