【发布时间】:2014-05-30 00:03:55
【问题描述】:
我有一个 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 吗?即使我在删除 WebView 后使用setNeedsDisplay: 或setNeedsLayout:,contentView 仍然没有重绘。
【问题讨论】:
标签: objective-c macos cocoa nsview nsopenglview