删除子视图后,包含NSOpenGLView的NSView不会重绘

时间:2014-05-30 00:03:55

标签: objective-c macos cocoa nsview nsopenglview

我有一个Mac OS X(10.9)应用程序,带有一个自定义NSView,用于我的主要NSWindow的contentView属性。自定义视图唯一的作用是覆盖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?即使我在删除WebView后使用setNeedsDisplay:setNeedsLayout:contentView仍然没有重绘。

1 个答案:

答案 0 :(得分:1)

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

我怀疑内容视图已重新绘制。它清楚地表明了。你所看到的是它背后的OpenGL表面。 OpenGL表面几乎原始的VRAM特性可能意味着在其上绘制的Web视图实际上修改了表面的内容。因此,我建议您强制OpenGL视图重绘自己。如果它使用-drawRect:,则应该足以发送-setNeedsDisplay:。如果您通过手动设置上下文,发出渲染命令,然后调用-drawRect:来在-flushBuffer之外进行渲染,那么您需要这样做。

相关问题