单击自定义 NSWindow

c-s*_*ile 3 macos nswindow

我有自定义 NSWindow,自定义 NSView 设置为其 contentView。

窗口初始化为:

[window setOpaque:NO];
[window setBackgroundColor: [NSColor clearColor]];
[window setHasShadow: NO];

[window setAcceptsMouseMovedEvents: YES];
[window setLevel: NSFloatingWindowLevel];
Run Code Online (Sandbox Code Playgroud)

内容视图,在其drawRect绘制由纯色填充的简单圆圈中。

所有这些都正常 - 窗口出现在桌面上,我看到了那个圆圈。

唯一不起作用的是:整个窗口矩形对于鼠标点击是不透明的。如果我将在圆圈外(但在不可见的窗口框内)单击,我的视图会接收 mouseDown 事件,但我希望底层窗口(或桌面)被激活。

看来我需要像 hitTest 方法在我的 NSWindow 类上被覆盖,但不幸的是没有这样的方法。

那么问题来了:是否可以在 OS X 中使用带有自定义点击区域的 NSWindow。如果“是”,那么如何?

更新:

查看按预期工作的RoundTransparentWindow示例 - 在透明区域中单击窗口。好像是这一段:

- (void)drawRect:(NSRect)rect {
   ...
   // Reset the window shape and shadow.
    if (shouldDisplayWindow) {
        [[self window] display];
        [[self window] setHasShadow:NO];
        [[self window] setHasShadow:YES];
    }
}
Run Code Online (Sandbox Code Playgroud)

在 CustomView.m 中与问题有关,但即使有它(在我的情况下)我也无法实现鼠标点击的透明度:(

c-s*_*ile 6

回答我自己的问题:

在 OS X 上,为了让窗口具有自定义形状并点击透明区域,必须满足以下条件:

  1. 例如,必须仅使用NSBorderlessWindowMaskset by创建窗口[window setStyleMask: NSBorderlessWindowMask]

  2. 不能要求[window setIgnoresMouseEvent: NO]它。由于该方法显然包含 Apple 方面的错误。

  3. 窗口的内容查看不得使用层。所以这样的事情也[[window contentView] setWantsLayer: YES]有效地禁用了点击。

以防万一:所有这些都是关于OS X 上Sciter 中的分层窗口处理

Windows、OS X 和 Linux 上的“Sciter 时钟”示例

  • 我不会说设置 `ignoresMouseEvents` 有问题。只是有三种状态(忽略所有事件,不忽略任何事件,忽略透明区域上的事件)。窗口从第三种状态开始,您可以设置属性以在前两种状态之间切换,但是一旦这样做,您将永远无法恢复到原始状态。这是一个不幸的设计。 (3认同)