2012-01-30 13 views
9

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

En otras palabras, el 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 evitar esto?

+0

¿Son las direcciones URL que va a cargar local o remoto? ¿Cómo maneja Safari los mismos enlaces? ¿Ha habilitado JavaScript en su vista de WebKit? –

+0

Es un flash entre una url local y una url remota. La forma en que Safari maneja la transición es instantánea. Sí, JavaScript está habilitado: el WebView no se procesa mientras se descarga la página nueva. –

Respuesta

13

Tuve el mismo problema, (sobre todo) lo solucioné implementando tres métodos delegados para deshabilitar el color en la ventana por @ justinvoss's suggestion on Twitter.

Debe tener mucho cuidado al desactivar el color en una ventana porque si lo deja desactivado toda su aplicación parece congelarse, por lo que me aseguro de no hacerlo varias veces y apilarlas (-webView:didCommitLoadForFrame: está documentado como a veces se llama varias veces para una sola carga), y sin querer dejar 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 sigo viendo destellos, mi teoría actual es que esta devolución de llamada se hace cuando se cargan todos los recursos, sino que el dibujo no es necesariamente terminado. Es una pena que esta sea la única devolución de llamada que tenemos.

Si se encuentra en 10.6 o mejor se puede trabajar alrededor de ellos usando este truco para retrasar ras permitiendo hasta el final de la prueba:

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