HUD面板中的子视图

时间:2014-11-03 09:26:30

标签: objective-c macos cocoa xib nib

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

我在Xib文件中有一个HUD面板,如下所示 enter image description here


但是当执行时按钮会失去其默认按钮状态。它看起来如下 After exxecution

如何在执行后保持按钮的外观。由于此外观,用户无法判断哪个操作将成为默认操作

2 个答案:

答案 0 :(得分:1)

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

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

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

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

Interface Builder:

Interface Builder

OS X 10.10:

OS X 10.10

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

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

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

如果删除标题栏,它将显示没有任何特殊样式:

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

HUD Panel without a title bar

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

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

我最终要做的是为HUD面板中的默认按钮绘制一个自定义按钮(带有一个简单的子类)。此解决方案很快,您可以在HUD面板中选择所需的默认按钮颜色(蓝色可能不是HUD面板,您的通话最佳)。

答案 1 :(得分:1)

尝试

_defaultButton.appearance = [NSAppearance appearanceNamed:NSAppearanceNameAqua];