我有一个每秒更新一次的NSWindow来显示当前时间。
这张图非常耗费处理器,我想避免在窗口完全被其他窗口遮挡的情况下这样做。
不幸的是,[NSWindow isVisible]不显示窗口是否实际可见,而是显示当前是否在屏幕上。意思是如果窗口在窗口列表中但被其他窗口完全遮挡isVisible == YES,我的自定义drawRect被调用,我最终将所有东西都绘制到一个从未使用过的缓冲区中。
有没有办法检测窗口及其内容是否在屏幕上实际可见?
非常感谢任何帮助。
答案 0 :(得分:7)
在10.9上,你可以使用NSWindow的-occlusionState和相关的委托方法。
从发行说明:
如果Windows的全部内容(包括标题栏和工具栏)被另一个不透明窗口100%覆盖,则视为被遮挡。如果Windows在屏幕外排序,最小化到底座或其他空间,Windows也会被遮挡。部分遮挡计为“可见”。
示例:
- (void)windowDidChangeOcclusionState:(NSNotification *)notification
{
if ([[notification object] occlusionState] & NSWindowOcclusionStateVisible) {
// visible
} else {
// occluded
}
}