我有一个每秒更新一次的 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/