NSView, содержащий NSOpenGLView, не перерисовывается после удаления подпредставления
У меня есть приложение Mac OS X (10.9) с пользовательским NSView для моего основного NSWindow contentView
имущество. Единственное, что делает пользовательский вид, это переопределение 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
все еще не перерисовал.
1 ответ
Совет Apple в эти дни состоит в том, чтобы использовать слои Core Animation для размещения обычных представлений поверх представлений OpenGL.
Я подозреваю, что представление контента перерисовалось само. Это ясно. То, что вы видите, это поверхность OpenGL за ней. Практически необработанная VRAM природа поверхностей OpenGL может означать, что веб-представление, нарисованное поверх него, фактически изменило содержимое поверхности. Поэтому я рекомендую вам перерисовать представление OpenGL. Если это привлекает его -drawRect:
, то этого должно быть достаточно для отправки -setNeedsDisplay:
, Если вы делаете рендеринг за пределами -drawRect:
вручную делая контекст текущим, выполняя команды рендеринга, а затем вызывая -flushBuffer
тогда вам нужно будет это сделать.