objective-c - 删除 subview 后,包含 NSOpenGLView 的 NSView 不会重绘

标签 objective-c macos cocoa nsview nsopenglview

我有一个 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/

相关文章:

ios - 根据不同的UITableViewCell点击加载不同的URL-iOS

objective-c - 处理隐藏的 Objective C 错误

ios - Objective-C 中的方法参数转换

cocoa - 当模式对话框打开时如何接收通知

iphone - UIGraphicsBeginImageContext 线程安全吗?

ios - 使用 NSAutolayout 概念如何在 ios 中的同一位置显示所有版本的按钮

ios - OS Sierra 10.12 上从终端重新签名 IPA 分段故障 11 错误

python - 如何在 mac 上安装 python 的 httplib2?

objective-c - NSTextView - 如何检测何时单击?

objective-c - 使用 NSPipe 执行交互式命令