【发布时间】:2011-02-25 18:34:32
【问题描述】:
我需要在可可应用程序中生成一个悬停在我的主窗口上方的窗口。我希望这个主窗口允许用户在输入框中输入一些文本。一切都很好,直到文本输入框真正获得焦点。主窗口变为“停用”。这个窗口是无边界的,并且是一个稍微自定义的形状——我想它更像是一张悬停卡片。
基本上,我希望这个东西几乎可以像 Spotlight(Apple + Space)一样工作——你可以输入文本,但这是一个辅助操作,在更大的 UX 环境中,你不需要希望主窗口的不和谐效果变灰(变为非活动状态)。您会注意到,当您打开某个应用程序并处于焦点位置时,聚光灯不会导致该应用程序的窗口变为非活动状态。
出现这个问题是因为文本输入似乎要求子窗口成为关键窗口(它不会让您将光标放在文本输入字段中)。当它成为键时,主窗口变为非活动状态。
到目前为止我已经尝试过:
- 为我的主应用程序子类化 NSWindow 并覆盖 isKeyWindow,这样它只会在应用程序不再是用户焦点(而不是窗口)时丢失密钥。这产生了与子窗口的键状态发生冲突并对键盘输入产生非常奇怪的影响(某些键没有被捕获,例如删除)的意外影响
- 创建视图而不是窗口。由于this 问题而无法正常工作——这些天你无法在 Webkit WebView 上绘图。
任何 Cocoa/OSX 向导有什么想法吗?我对这个有点着迷了。我抓不到的痒。
编辑:还尝试在子窗口上覆盖以下内容。单击时,该窗口会使主应用程序窗口变为非活动状态。
- (BOOL)canBecomeKeyWindow {
return YES;
}
- (BOOL)canBecomeMainWindow {
return NO;
}
编辑 2: 在使用了 NSMenu 一段时间后,我放弃了这种方法。然而,我似乎发现了一些东西。在 NSPanel 中有一个窗口样式的掩码叫做:
NSNonactivatingPanelMask
The panel can receive keyboard input without activating the owning application.
Valid only for an instance of NSPanel or its subclasses; not valid for a window.
现在试试这个...
编辑 3:NSNonactivatingPanelMask 没有做到这一点。没有想法。
【问题讨论】:
-
您找到解决方案了吗?抱歉,本可以通过电子邮件与您联系,但您的网站似乎已关闭。
标签: cocoa macos nswindow textinput spotlight