如何确定NSWindow的任何部分目前是否可见(不仅仅是订购)

时间:2013-01-08 15:40:42

标签: macos cocoa custom-controls nswindow

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

这张图非常耗费处理器,我想避免在窗口完全被其他窗口遮挡的情况下这样做。

不幸的是,[NSWindow isVisible]不显示窗口是否实际可见,而是显示当前是否在屏幕上。意思是如果窗口在窗口列表中但被其他窗口完全遮挡isVisible == YES,我的自定义drawRect被调用,我最终将所有东西都绘制到一个从未使用过的缓冲区中。

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:7)

在10.9上,你可以使用NSWindow的-occlusionState和相关的委托方法。

从发行说明:

  

如果Windows的全部内容(包括标题栏和工具栏)被另一个不透明窗口100%覆盖,则视为被遮挡。如果Windows在屏幕外排序,最小化到底座或其他空间,Windows也会被遮挡。部分遮挡计为“可见”。

示例:

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