【发布时间】: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