【问题标题】:Cocoa WebView navigation white flashCocoa WebView 导航白闪
【发布时间】:2012-01-30 05:16:51
【问题描述】:

每当我的 WebView 在 URL 之间导航时,都会出现白色闪烁。

也就是说,WebView 在导航之间处于未渲染状态,只显示应用程序的背景色。

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 您正在加载的 URL 是本地的还是远程的? Safari 如何处理相同的链接?您是否在 WebKit 视图中启用了 JavaScript?
  • 这是一个本地 url 和一个远程 url 之间的闪光。 Safari 手柄的过渡瞬间。是的,JavaScript 已启用 - 在下载新页面时 WebView 未呈现。

标签: cocoa webview


【解决方案1】:

我遇到了同样的问题,(大部分)通过实现三个委托方法来解决它,以根据@justinvoss 的suggestion on Twitter 禁用窗口上的刷新。

在窗口上禁用刷新时需要非常小心,因为如果禁用它,整个应用程序似乎会冻结,所以我确保我不会多次执行此操作并将它们堆叠起来(-webView:didCommitLoadForFrame: 已记录有时会为单个负载多次调用)并意外使窗口冻结

@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 或更高版本,则可以使用此 hack 解决它们,将刷新启用延迟到事件结束:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 2017-03-10
    • 2012-06-26
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多