透明背景WKWebView(NSView)

时间:2014-11-30 08:51:43

标签: macos swift appkit

我正在使用Swift构建Mac应用程序。因此,我想让WKWebView透明,因此它显示了加载的HTML的文本,但我的底层NSWindow的背景是可见的。 我试过了

webView.layer?.backgroundColor = NSColor.clearColor().CGColor;

没有任何影响。 WKWebView继承自NSView,但我不知道这是否有帮助。

另一个解决方案是插入一个NSVisualEffectView作为WebView的背景,但我也不知道如何实现这一点!

5 个答案:

答案 0 :(得分:8)

它不受支持,然后他们修复了它:

https://bugs.webkit.org/show_bug.cgi?id=134779

使其透明的方法是:

myWebView.opaque = false

答案 1 :(得分:5)

下面的代码非常适合我,默认情况下颜色也设置为clearColor。

[wkWebView setValue:YES forKey:@"drawsTransparentBackground"];

答案 2 :(得分:4)

在macOS 10.12及更高版本中使用它:

webView.setValue(false, forKey: "drawsBackground")

答案 3 :(得分:1)

我将它用于macOS 10.12。在OjbC没有问题:

[self.webView setValue:@YES forKey:@"drawsTransparentBackground"];

在macOS 10.13。+我收到以下控制台警告消息:

  

- [WKWebView _setDrawsTransparentBackground:]已弃用,不应使用

唯一可行的解​​决方案是:

[self.webView setValue:@(NO) forKey:@"drawsBackground"];

我在很多场景中都尝试过以下操作,但它没有用:

  • 给webView和enclosingScrollView一个图层并编辑它的属性(backgroundColor,isOpaque)
  • 为webView和enclosingScrollView提供清晰的背景颜色
  • 在没有setValue forKey的情况下注入javascript:在webview中。

此外我确实使用过:

- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation
{
    if (self.isWebviewsBackgroundTransparent) {
        [self insertTransparentBackgroundTo:webView];
    }
}

- (void)insertTransparentBackgroundTo:(WKWebView *)webView
{
    NSString *transparentBackgroundJSSString = @"document.body.style = document.body.style.cssText + \";background: transparent !important;\";";
    [webView evaluateJavaScript:transparentBackgroundJSSString completionHandler:nil];
}

答案 4 :(得分:1)

更新的、稍微好一点的解决方案 (2021)。在 WKWebViewConfiguration 上使用私有属性 drawsBackground。它的属性已在 macOS 10.14 中引入,因此不会消失。

//https://opensource.apple.com/source/WebKit2/WebKit2-7610.2.11.51.8/UIProcess/API/Cocoa/WKWebViewConfigurationPrivate.h.auto.html
@property (nonatomic, setter=_setDrawsBackground:) BOOL _drawsBackground WK_API_AVAILABLE(macos(10.14), ios(12.0));

let configuration = WKWebViewConfiguration()
var requiresDrawBackgroundFallback = false
if #available(OSX 10.14, *) {                         
    configuration.setValue(false, forKey: "sward".reversed() + "background".capitalized) //drawsBackground KVC hack; works but private
} else {
    requiresDrawBackgroundFallback = true
}
let webView = WKWebView(frame: .zero, configuration: configuration)
if requiresDrawBackgroundFallback {
    webView.setValue(false, forKey: "sward".reversed() + "background".capitalized) //drawsBackground KVC hack; works but private
}