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тогда вам нужно будет это сделать.

Другие вопросы по тегам