Cocoa WebView导航白色闪光灯



每当我的WebView在URL之间导航时,我都会得到一个白色的闪光。

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

有什么办法绕过这个吗?

我也遇到了同样的问题,(大部分)根据@justinvoss在推特上的建议,通过实现三个委托方法来禁用窗口刷新,从而解决了这个问题。

在禁用窗口刷新时,你需要非常小心,因为如果你让它处于禁用状态,你的整个应用程序就会冻结,所以我确保我不会多次这样做并将它们堆叠起来(-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或更好的版本,你可以使用这个破解来延迟刷新启用,直到事件结束:

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

相关内容

  • 没有找到相关文章

最新更新