webkitview cocoa webview

webkitview - Cocoa WebView navigation white flash



wk webview (1)

Recibo un destello blanco cada vez que mi WebView navega entre las URL.

En otras palabras, WebView está en un estado no entregado entre navegación, y solo muestra el color de fondo de la aplicación.

¿Alguna idea sobre cómo soslayar esto?


Tuve el mismo problema, (principalmente) lo solucioné implementando tres métodos de delegado para desactivar el color en la ventana por sugerencia de @ justinvoss en Twitter .

Debes tener mucho cuidado al deshabilitar el color en una ventana porque si lo dejas inhabilitado, toda tu aplicación parece congelarse, así que me aseguro de no hacerlo varias veces y -webView:didCommitLoadForFrame: ( -webView:didCommitLoadForFrame: está documentado como a veces se lo llama varias veces para una sola carga) y accidentalmente deja la ventana congelada

@implementaton ViewControllerClass { BOOL _windowFlushDisabled; } - (void)webView:(WebView *)sender didCommitLoadForFrame:(WebFrame *)frame; { if (!_windowFlushDisabled && sender.window) { [sender.window disableFlushWindow]; _windowFlushDisabled = YES; } } - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame; { if (_windowFlushDisabled) { [sender.window enableFlushWindow]; [sender.window flushWindowIfNeeded]; _windowFlushDisabled = NO; } } - (void)webView:(WebView *)sender didFailLoadWithError:(NSError *)error forFrame:(WebFrame *)frame; { [self webView:sender didFinishLoadForFrame:frame]; // re-enable flushing } @end

De vez en cuando todavía veo flashes, mi teoría actual es que esta devolución de llamada se realiza cuando se cargan todos los recursos, pero ese dibujo no está necesariamente terminado. Es una pena que esta sea la única devolución de llamada que tenemos.

Si tienes 10.6 o más, puedes evitarlos usando este truco para retrasar la descarga hasta el final del evento:

- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame; { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ if (_windowFlushDisabled) { [self.libraryDocument.windowForSheet enableFlushWindow]; [self.libraryDocument.windowForSheet flushWindowIfNeeded]; _windowFlushDisabled = NO; } }]; }