web-dev-qa-db-ja.com

WKWebViewの透明な背景

私のアプリでは、背景が透明なWKWebViewを作成して、背後のビュー(ImageView)が背景画像として透けて見えるようにします。

    webView!.opaque = false
    webView!.backgroundColor = UIColor.clearColor()

上記のコードはUIWebViewで正常に機能しますが、webViewがWKWebViewの場合、白い背景が表示されます。

また、CSSに透明な背景色を入れてみました。結果は同じで、UIWebViewでのみ機能し、WKWebViewでは機能しません。なにか提案を?

32
Lim Thye Chean

Swiftを使用するiOS 10以降の場合:

self.webView = WKWebView()
self.webView!.isOpaque = false
self.webView!.backgroundColor = UIColor.clear
self.webView!.scrollView.backgroundColor = UIColor.clear
42
pim

このコードが役に立つかもしれません。 Swift 3+

self.webView = WKWebView()
self.webView.isOpaque = false
self.webView.backgroundColor = UIColor.clear
self.webView.scrollView.backgroundColor = UIColor.clear
19
BilalReffas

このバグはベータ5で修正されたようです。

5
mszaro

以下のコードは私のために機能します:

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

PDFをロードしていて、標準のグレーとは異なる背景色が必要な場合は、ドキュメントがロードされるまで待ってから、サブビューの背景をクリアする必要があるようです。 WKWebView(iOS 11+)よりもPDFViewを使用する利点は、WKWebViewsにダブルタップしてズームする機能とページ数インジケーターが組み込まれており、古いバージョンと互換性があることです。 iOSのバージョン。

Appleは、実装をいつでも変更でき、ソリューションを破壊する可能性があるため、.

PDFプレビューコントローラをSwift 4:

class SomeViewController: UIViewController {

    var observer: NSKeyValueObservation?
    var url: URL

    init(url: URL) {
        self.url = url
        super.init(nibName: nil, bundle: nil)
    }

    func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.black
        let webView = WKWebView()
        webView.translatesAutoResizingMaskIntoConstraints = false
        self.view.addSubview(webView)
        NSLayoutConstraint.activate([
            webView.topAnchor.constraint(equalTo: self.view.topAnchor),
            webView.leftAnchor.constraint(equalTo: self.view.leftAnchor),
            webView.rightAnchor.constraint(equalTo: self.view.rightAnchor),
            webView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor)
        ])

        self.observer = webView.observe(\.isLoading, changeHandler: { (webView, change) in
            webView.clearBackgrounds()
        })

        webView.loadFileURL(self.url, allowingReadAccessTo: self.url)

    }
}

extension UIView {
    func clearBackgrounds() {
        self.backgroundColor = UIColor.clear
        for subview in self.subviews {
            subview.clearBackgrounds()
        }
    }
}
1
Phil

これは非常に古い質問です。しかし、私は今日これに苦労しています。私だけなのかわかりませんが、webView.backgroundColorはWKWebViewでは未定義で、webView.opaqueは読み取り専用でした。これを修正する唯一の方法は、Webビューレイヤーの背景色をCGColor clearに設定することでした

webview.wantsLayer = true
webView.layer?.backgroundColor = NSColor.clearColor().CGColor

nSViewも同じ方法で

webViewParent.layer?.backgroundColor = NSColor.clearColor().CGColor

それは私のために働いた唯一のものであり、私はそれが他の誰かにも役立つことを願っています。

0
bedalton

WKWebViewとはまだ連携していませんが、UIWebViewでもこの問題が発生していました。解決策は、htmlコンテンツを次のようなものでラップすることでした。

<body style="background-color:transparent;"></body>

それが役に立てば幸い。

0
babibo