NSPanel 未接收 mousedragged 事件

5 xcode cocoa objective-c draggable nswindow

我有一个无边框 NSPanel,当我第一次启动它并且它具有焦点时,我可以拖动它并且 mousedragged 方法会正确触发,但是当我将焦点切换到另一个应用程序然后返回到 NSPanel (使用 NSNonactivatingPanelMask 设置)时我不再收到 mousedraged 事件。

我仍然收到 mouseup 和 mousedown 事件,所以我不知道为什么 mousedragged 事件没有被执行。

有任何想法吗?

下面是它的初始化方式:

   _panel  = [[MyPanel alloc] initWithContentRect:frame
              styleMask:NSBorderlessWindowMask | NSNonactivatingPanelMask
              backing:NSBackingStoreBuffered
              defer:NO];
Run Code Online (Sandbox Code Playgroud)

我还尝试将所有这些方法添加到我的面板类中:

- (BOOL)canBecomeKeyWindow {
    return YES;
}

- (BOOL)canBecomeMainWindow
{
    return YES;
}

- (BOOL)canBecomeFirstResponder {
    return YES;
}

- (BOOL)acceptsFirstResponder
{
    return YES;
}

- (BOOL)acceptsFirstMouse
{
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

并使其成为鼠标按下时的第一响应者(它仍然收到):

- (void)mouseDown:(NSEvent *)theEvent
{
    [self makeFirstResponder:self];
    [self makeKeyWindow];
    [self setBackgroundColor:[NSColor redColor]];
    [self display];
}
Run Code Online (Sandbox Code Playgroud)

mousedragd 仅包含以下内容:

- (void)mouseDragged:(NSEvent *)theEvent
{
    [self setBackgroundColor:[NSColor greenColor]];
    [self display];
    NSLog(@"dragged");
}
Run Code Online (Sandbox Code Playgroud)

我不希望窗口获得焦点。(重点应放在下面的第三方应用程序上)。

更新:我添加了一个示例项目,请在此处下载: http: //users.telenet.be/prullen/MovingPanel.zip

正如您将看到的,当您第一次运行该应用程序并拖动它时,它将在console.log中连续输出“dragged”(并且背景颜色将为绿色)。如果您随后切换到另一个应用程序,然后返回 movingpanel 应用程序,则拖动将不会再输出任何内容。(背景颜色将为红色,这是在 mousedown 事件处理程序中设置的)。

如果没有 NSNonactivatingPanelMask,它会正常工作,但面板下方的窗口保持活动状态至关重要。如果还有其他方法可以实现此目的,请分享。

我还注意到一件事,如果您双击面板(快速),然后拖动,它会变成绿色(因此 mousedragged: 正在被调用),但它没有移动......不知道该怎么想。

eri*_*icg 0

我还注意到,如果我这样做 [self setMovableByWindowBackground:NO]; 那么它也会正常工作。我敢打赌 setMovableByWindowBackground 的工作方式会干扰 mouseDragged 的​​调用。这可能是一个被调用的错误。

我猜想一种可能的解决方案是实现您自己的窗口拖动。

如果您真正感兴趣的是在窗口移动时做出响应,则此问题和答案可能会提供您所需要的内容。

如何在鼠标移动窗口时接收通知?