gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:11:35 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com