7

現在の時刻を表示するために毎秒更新されるNSWindowがあります。

この描画は非常にプロセッサを集中的に使用するため、ウィンドウが他のウィンドウによって完全に隠されている間は避けたいと思います。

残念ながら、[NSWindow isVisible]は、ウィンドウが実際に画面に表示されているかどうかを表示せず、現在画面に表示されているかどうかのみを表示します。つまり、ウィンドウがウィンドウリストにあるが、他のウィンドウによって完全に隠されている場合isVisible == YES、カスタムdrawRectが呼び出され、使用されないバッファにすべてを描画することになります。

ウィンドウとそのコンテンツが実際に画面に表示されているかどうかを検出する方法はありますか?

どんな助けでも大歓迎です。

4

1 に答える 1

8

10.9 では、NSWindow の -occlusionState と関連するデリゲート メソッドを使用できます。

リリースノートから:

タイトル バーとツールバーを含むコンテンツ全体が別の不透明なウィンドウで 100% 覆われている場合、そのウィンドウは遮られていると見なされます。ウィンドウは、画面外に配置されている場合、ドックに最小化されている場合、または別のスペースにある場合にも隠されます。部分的なオクルージョンは「可視」としてカウントされます。</p>

例:

- (void)windowDidChangeOcclusionState:(NSNotification *)notification
{
    if ([[notification object] occlusionState]  &  NSWindowOcclusionStateVisible) {
        // visible
    } else {
        // occluded
    }
}
于 2014-03-20T04:28:07.320 に答える