我有一个 Mac OS X (10.9) 应用程序,其主 NSWindow 的 contentView
属性具有自定义 NSView。自定义 View 唯一要做的就是重写drawRect:
,使其透明。需要透明度,以便我的 NSOpenGLView 可见(见下文):
/* Transparent NSView Subclass */
- (void)drawRect:(NSRect)dirtyRect
{
NSLog(@"Drawing Rect");
[[NSColor clearColor] set];
NSRectFillUsingOperation(dirtyRect, NSCompositeClear);
}
contentView
有一个 NSOpenGLView 作为 subview ,其表面顺序设置为 -1(它位于主 NSWindow 的“下方”,也是透明的):
/* NSOpenGLView subclass: */
GLint order = -1;
[self.openGLContext setValues:&order forParameter:NSOpenGLCPSurfaceOrder];
然后我实例化一个 WebView 并将其放置为该自定义 View 的 subview :
_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 添加为 subview ,WebView 就会消失。
subview 被删除后,contentView
不应该触发 drawRect
吗?即使我在删除 WebView 后使用 setNeedsDisplay:
或 setNeedsLayout:
,contentView
仍然没有重绘。
最佳答案
Apple 最近的建议是使用核心动画层将普通 View 置于 OpenGL View 之上。
我怀疑内容 View 已自行重绘。它很清楚。您所看到的是其背后的 OpenGL 表面。 OpenGL 表面的近乎原始 VRAM 性质可能意味着在其之上绘制的 Web View 实际上修改了表面的内容。因此,我建议您强制 OpenGL View 自行重绘。如果它在其 -drawRect:
中绘制,那么发送它 -setNeedsDisplay:
就足够了。如果您通过手动将上下文设置为当前上下文、发出渲染命令,然后调用 -flushBuffer
在 -drawRect:
之外进行渲染,那么您需要执行此操作。
关于objective-c - 删除 subview 后,包含 NSOpenGLView 的 NSView 不会重绘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23945002/