HUD 面板中的子视图

Posted

技术标签:

【中文标题】HUD 面板中的子视图【英文标题】:Sub views in HUD Panel 【发布时间】:2014-11-03 09:26:29 【问题描述】:

我正在开发 OSX 10.10 我面临一个奇怪的问题,即 HUD 面板的子视图颜色反转。 例如,设置为默认按钮时的按钮在 Xib 文件中看起来是正确的,但在执行时按钮的外观会被 HUD 面板修改。

我的 Xib 文件中有一个 HUD 面板,如下所示


但在执行时,按钮会失去其默认按钮状态。它看起来如下

如何在执行后保持按钮的外观。由于这种外观和感觉,用户无法判断哪个动作将是默认动作

【问题讨论】:

你试过在窗口和按钮之间创建一个视图吗? 没有。我只是拖了一个HUD面板,然后拖了一个Push按钮,并设置了相当于Command Return的键。 【参考方案1】:

试试

_defaultButton.appearance = [NSAppearance appearanceNamed:NSAppearanceNameAqua];

【讨论】:

【参考方案2】:

Interface Builder 遵循一组规则,但这些规则不依赖于上下文。我所说的上下文是“显示在 HUD 面板中”。

在这种情况下应用的规则是“如果按钮是默认按钮,则在 Interface Builder 中绘制一个蓝色按钮”,即使它并不总是发生这种情况(参见您在第二个屏幕截图中看到的内容)。

我不知道它是从哪个 OS X 版本开始工作的,但现在 HUD 面板中的控件以不同的样式显示(默认按钮没有特殊颜色)。

您可以通过在 HUD 面板中添加一个简单的NSTextField 来确认此 Interface Builder 功能,它会在 Interface Builder 中以白色背景绘制,但在使用灰色对焦环运行时将具有黑色背景。

界面构建器:

OS X 10.10:

我从来没有找到一种方法来禁用 HUD 面板中控件的这种特殊样式,但有几种解决方法(即使没有特殊颜色,默认按钮仍然可以正常工作)。

仅当您的 HUD 面板有标题栏时才会出现特殊样式。

self.panel.styleMask = (NSHUDWindowMask | NSTitledWindowMask | NSUtilityWindowMask | NSNonactivatingPanelMask);

如果您删除标题栏,它会在没有任何特殊样式的情况下显示:

self.panel.styleMask = (NSHUDWindowMask | NSUtilityWindowMask | NSNonactivatingPanelMask);

此时,您可以在面板中实现并绘制自己的标题栏并模仿默认的标题栏。我不是很喜欢这种方法,因为首先,一个简单的按钮需要做很多工作,而且控件的自定义样式使它们在 HUD 面板中更漂亮且更易于阅读。

另一种解决方案是“VLC”方式。他们使用 HUD 面板,但他们的控件没有任何特殊样式。他们正在使用BGHUDAppKit,它是在 Apple 提供 HUD 面板时发布的,但没有任何特殊控件。他们使用它来强制使用蓝色风格,而不是现在在 HUD 面板中默认使用的灰色风格。 我也不是很喜欢这种方法,我不想为一个简单的按钮添加一个库,该库自 2011 年以来没有更新。

我最终做的是为 HUD 面板中的默认按钮绘制一个自定义按钮(带有一个简单的子类)。此解决方案速度很快,并允许您为 HUD 面板中的默认按钮选择所需的颜色(对于 HUD 面板来说,蓝色可能不是最好的,请自行决定)。

【讨论】:

以上是关于HUD 面板中的子视图的主要内容,如果未能解决你的问题,请参考以下文章

如何添加HUD? (iOS)

NSTableView reloadData 内存泄漏

在 iOS 8 中隐藏音量 HUD

ios如何获取视图中的子视图列表? [关闭]

将 Ortho 切换到 OpenGL HUD 的透视图

tableView 作为半透明视图中的子视图