如何检测 NSView 或其父 NSWindow 的活动外观?

How to detect active appearance for NSView or for its parent NSWindow?

所有本机控件在其父级 window 处于活动或非活动状态时具有不同的外观。我们应该如何在自定义组件中检查此状态,例如在渲染纽扣电池时?

我们可以检查 controlView.window 的属性,例如 isMainWindowisKeyWindow,但它们并未涵盖所有情况。例如,如果您在桌面上打开一个 window 应用程序并在全屏 Space 中打开另一个应用程序,则根据 public API,其中只有一个可以是 key 或 main。但是,标准控件似乎使它们在 Space 中都处于活动状态:

请注意两个 Safari windows 中的工具栏按钮是如何呈现为活动的。我们如何实现相同的行为?

幸运的是,SwiftUI 允许从环境继承一个新的魔法属性:

/// Window state.
@Environment(\.controlActiveState)
var windowState: ControlActiveState

这是官方的解决方案。干杯!