macos - 如何查明 NSWindow 的任何部分当前是否可见(不仅仅是订购的)

标签 macos cocoa custom-controls nswindow

我有一个每秒更新一次的 NSWindow 以显示当前时间。

此绘图需要占用大量处理器资源,我希望避免在窗口完全被其他窗口遮挡时执行此操作。

不幸的是,[NSWindow isVisible] 并不显示窗口在屏幕上是否实际可见,而仅显示它当前是否在屏幕上。这意味着如果该窗口位于窗口列表中但完全被其他窗口 isVisible == YES 遮挡,我的自定义drawRect将被调用,并且我最终将所有内容绘制到从未使用过的缓冲区中。

有没有办法检测窗口及其内容在屏幕上是否实际上可见?

任何帮助将不胜感激。

最佳答案

在 10.9 上,您可以使用 NSWindow 的 -occlusionState 和关联的委托(delegate)方法。

来自发行说明:

Windows are considered occluded if their entire content, including title bar and tool bar, is 100% covered by another opaque window. Windows are also occluded if they are ordered off screen, minimized to the dock, or on another space. Partial occlusion counts as “visible.”

示例:

- (void)windowDidChangeOcclusionState:(NSNotification *)notification
{
    if ([[notification object] occlusionState]  &  NSWindowOcclusionStateVisible) {
        // visible
    } else {
        // occluded
    }
}

关于macos - 如何查明 NSWindow 的任何部分当前是否可见(不仅仅是订购的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14218625/

相关文章:

ios - 通过 avfoundation 偏移时间码

wpf - 错误: “' Subjects' property was already registered by 'Period' ” is raised when more than one control is placed on the form

javascript - Xpages:包含多个相同自定义控件的页面不唯一

macos - 使用 sips 从一个 png 文件创建一个 icns 文件

macos - 我如何从 bash 脚本中找出当前的 osx-terminal 主题

macos - 响应式滚动 - setWantsLayer Webkit 问题

objective-c - 如何删除用 NSBezierPath 绘制的内容?

objective-c - 切换网络后网络运行失败

java - 在 fxml 中使用自定义控件

html 网站内容在 MAC 操作系统上不可见但在其他操作系统上工作正常?