cocoa - 在一个窗口中使用 mouseMoved 的多个自定义控件

标签 cocoa events controls mouse

一开始我有一个带有自定义控件的窗口。为了让它接受鼠标移动事件,我只需将其放入 awakeFromNib 中:

代码:

[[self 窗口] makeFirstResponder:self]; [[自身窗口] setAcceptsMouseMovedEvents:YES];

现在我正在同一个窗口中与其中的四个一起做某事,但这不再那么漂亮了。首先,我将它们从控件的 awakeFromNib 中取出,并决定使用我的 appController 来管理它,即 [window makeFirstResponder:View]

我的问题是,如果我希望其中四个响应鼠标移动事件,如何在同一 View 中管理其中四个?现在,我已经告诉窗口响应 mouseMoved 事件,但没有任何 View 响应 mouseMoved。

最佳答案

您还需要重写 -acceptsFirstResponder 以返回 YES。

    #pragma mark NSResponder Overrides
    - (BOOL)acceptsFirstResponder
    {
    return YES;
    }

-mouseMoved 事件的开销很大,因此当调用控件的 -mouseExited 消息时我会关闭鼠标移动事件,并在 -mouseEntered 中将其打开。

    - (void)mouseEntered:(NSEvent *)theEvent
{
    [[self window] setAcceptsMouseMovedEvents:YES];
    [[self window] makeFirstResponder:self];
}

- (void)mouseMoved:(NSEvent *)theEvent
{
...
}

- (void)mouseExited:(NSEvent *)theEvent
{
    [[self window] setAcceptsMouseMovedEvents:NO];
}

我在我的自定义控件应用程序中快速测试了这一点。我在 nib 文件中多次复制该控件,并且它按预期工作。

您可能还需要:

- (void)awakeFromNib
{
    [[self window] setAcceptsMouseMovedEvents:YES];
    [self addTrackingRect:[self bounds] owner:self userData:NULL assumeInside:YES];
}

我认为 -setAcceptsMouseMovedEvents 不是必需的,但我很确定跟踪矩形代码是必需的。您可能还需要尝试假设内部:参数的值,但这已记录在案。

关于cocoa - 在一个窗口中使用 mouseMoved 的多个自定义控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/502038/

相关文章:

javascript - 当我在一页上有多个谷歌地图时(在 chrome、safari 和 ie 中),控件不起作用

jquery - 如何检测是否按下了 Ctrl+R?

objective-c - NSMutableDictionary 添加子项

ios - Xcode - 如何修复 'NSUnknownKeyException' ,原因 : … this class is not key value coding-compliant for the key X"error?

objective-c - NSTableView 默认没有选择行

objective-c - 如何创建具有多个显示三角形的调整大小窗口?

android - 如何通过系统发送合成的MotionEvent?

javascript - Ajax 响应在 10% 的时间内不起作用

实现上下文菜单时的 jQuery 事件问题?

c# - SomePanel.Controls 中的 foreach Control ctrl 未获取所有控件