2012-01-30 4 views
9

Я получаю белую вспышку всякий раз, когда мой WebView перемещается между URL-адресами.Cocoa WebView navigation white flash

Другими словами, WebView находится в состоянии незанятого состояния между навигацией и просто показывает цвет фона приложения.

Любые идеи о том, как обойти это?

+0

ли URL, загружаемой локальный или удаленный? Как Safari обрабатывает одни и те же ссылки? Включили ли вы JavaScript в своем представлении WebKit? –

+0

Это вспышка между локальным URL и удаленным URL. Safari обрабатывает переход мгновенно. Да, JavaScript включен - WebView не отображается, пока загружается новая страница. –

ответ

13

У меня была эта же проблема (в основном) исправлено ее, реализовав три метода делегата, чтобы отключить флеш в окне на @ justinvoss suggestion on Twitter.

Вы должны быть очень осторожны при отключении флеша в окне, потому что, если вы оставите его отключенным, все ваше приложение замерзает, поэтому я не делаю этого несколько раз и складываю их (документирован иногда вызываться несколько раз для одной нагрузки) и случайно оставить окно заморожено

@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 

иногда я все еще вижу вспышки, моя текущая теория является то, что этот обратный вызов сделан, когда все ресурсы загружены, но что рисунок не обязательно законченный. Жаль, что это единственный обратный вызов, который у нас есть.

Если вы на 10.6 или лучше вы можете работать вокруг них с помощью этого хака, чтобы задержать поток не позволяет до конца мероприятия:

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