【问题标题】:How to detect active appearance for NSView or for its parent NSWindow?如何检测 NSView 或其父 NSWindow 的活动外观?
【发布时间】:2019-10-03 10:04:45
【问题描述】:

所有本机控件在其父窗口处于活动或非活动状态时具有不同的外观。我们应该如何在自定义组件中检查这种状态,例如在渲染按钮单元格时?

我们可以检查controlView.window 的属性,例如isMainWindowisKeyWindow,但它们并不涵盖所有情况。例如,如果您在桌面上打开应用程序的一个窗口,而在全屏空间中打开另一个窗口,则根据公共 API,其中只有一个可以是 key 或 main。但是,标准控件似乎将它们在两个空间中都呈现为活动状态:

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

【问题讨论】:

  • 你能检查一下windows全屏状态吗?
  • @Mattie 当你从全屏空间切换到桌面时这还是不够用????
  • 我认为这是一个愚蠢的建议。 developer.apple.com/documentation/appkit/nswindow/… 怎么样
  • @MarekH 不确定你的意思。调试活动窗口几乎是不可能的,因为您需要在应用程序之间切换。我敢打赌 Safari 使用了一个名为 NSWindow.hasActiveAppearance 的私有 API。
  • 似乎NSWindow.hasActiveAppearance 涵盖了所有情况。但该属性不符合 KVC 标准,因此我们需要为其找到私人通知或使用计时器来获取更新。

标签: cocoa nsview nswindow appkit nscell


【解决方案1】:

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

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

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

【讨论】:

  • 这里不包括一种情况,即1.让你的窗口处于活动状态但不是全屏; 2.切换到全屏应用; 3. Command-Tab 切换到同一个 Space 上的另一个应用程序,该应用程序上有您的活动窗口 -> controlActiveState 在您的窗口不再活动时保持key 状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-06
  • 2020-07-25
  • 1970-01-01
相关资源
最近更新 更多