1

メインの NSWindow プロパティ用のカスタム NSView を備えた Mac OS X (10.9) アプリケーションがありcontentViewます。カスタム ビューが行う唯一のことは、drawRect:透明になるようにオーバーライドすることです。NSOpenGLView が表示されるようにするには、透明性が必要です (以下を参照)。

/* Transparent NSView Subclass */
- (void)drawRect:(NSRect)dirtyRect
{
  NSLog(@"Drawing Rect");
  [[NSColor clearColor] set];
  NSRectFillUsingOperation(dirtyRect, NSCompositeClear);
}

サブビューとして NSOpenGLView があり、そのcontentView表面の順序が -1 に設定されています (メインの NSWindow の「下」にあり、これも透過的です)。

/* NSOpenGLView subclass: */
GLint order = -1;
[self.openGLContext setValues:&order forParameter:NSOpenGLCPSurfaceOrder];

次に、WebView をインスタンス化し、このカスタム ビューのサブビューとして配置します。

_webview = [[WebView alloc] initWithFrame:frame];
[_webview setMaintainsBackForwardList:NO];
[_webview setTranslatesAutoresizingMaskIntoConstraints:NO];
[_webview setDrawsBackground:NO];
[_window.contentView addSubview:_webview];

WebView は、サービスへのログインに使用される (NSOpenGLView の上にある) ウィンドウ内の小さなボックスです。ログインが発生すると、NSOpenGLView のみが表示されて消えます。

問題は次のとおりです。呼び出すと[_webview removeFromSuperview];contentView再描画されません。したがって、WebView は引き続き画面に描画されます (ただし、マウスやキーボードには反応しません)。マウスを使用してすべてのウィンドウのサイズを変更すると、contentView再描画され (ログにメッセージが表示されます)、WebView のコンテンツが消えます。また、NSOpenGLView をサブビューとして追加しないと、WebView が消えてしまいます。

サブビューが削除されcontentViewた後に発火するべきではありませんか? WebViewdrawRectを使用した場合、setNeedsDisplay:または削除した後でも、再描画されませんでした。setNeedsLayout:contentView

4

1 に答える 1

1

最近の Apple のアドバイスは、コア アニメーション レイヤーを使用して、通常のビューを OpenGL ビューの上に配置することです。

コンテンツ ビューが再描画されたのではないかと思います。くっきりと描きます。表示されているのは、その背後にある OpenGL サーフェスです。OpenGL サーフェスのほぼ生の VRAM の性質は、その上に描画された Web ビューが実際にサーフェスのコンテンツを変更したことを意味する場合があります。したがって、OpenGL ビューを強制的に再描画することをお勧めします。を引き込む場合は、-drawRect:送信するだけで十分-setNeedsDisplay:です。-drawRect:手動でコンテキストを現在の状態にし、レンダリング コマンドを発行してから を呼び出して の外部でレンダリングを行う場合は-flushBuffer、それを行う必要があります。

于 2014-05-30T03:43:08.330 に答える