我有一个 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
仍然没有重绘。