1

我有一个 Mac OS X (10.9) 应用程序,它为我的主 NSWindow 的contentView属性提供了一个自定义 NSView。自定义视图唯一要做的就是覆盖drawRect:,使其透明。透明度是必需的,以便我的 NSOpenGLView 可见(见下文):

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

contentView一个 NSOpenGLView 作为子视图,其表面顺序设置为 -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着火吗?drawRect即使我使用setNeedsDisplay:setNeedsLayout:删除 WebView 后contentView仍然没有重绘。

4

1 回答 1

1

Apple 最近的建议是使用 Core Animation 层将普通视图放在 OpenGL 视图之上。

我怀疑内容视图已经重绘了自己。它画得很清楚。您看到的是它背后的 OpenGL 表面。OpenGL 表面的近乎原始 VRAM 特性可能意味着在其上绘制的 Web 视图实际上修改了表面的内容。因此,我建议您强制 OpenGL 视图重绘自身。如果它吸引了它-drawRect:,那么它应该足以发送它-setNeedsDisplay:。如果您-drawRect:通过手动使上下文成为当前上下文、发出渲染命令然后调用来进行渲染-flushBuffer,那么您将需要这样做。

于 2014-05-30T03:43:08.330 回答