web-dev-qa-db-ja.com

WKWebViewは灰色の背景を表示し、PDFコンテンツはviewcontrollerスイッチで非表示になります

WKWebViewのメインバンドルまたはドキュメントディレクトリからPDFファイルを読み込んでいます。最初は完全に読み込まれますが、タブバーコントローラーでタブを切り替えた後に同じ画面に戻ると、背景が灰色になり、PDFコンテンツが表示されなくなります。これが私がロードするために使用しているコードです

class ViewController: UIViewController {

    @IBOutlet var progressView: UIProgressView!
    @IBOutlet var webView: WKWebView!

    var pdfURLS: URL?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        pdfURLS = Bundle.main.url(forResource: "97_pdf", withExtension: "pdf", subdirectory: nil, localization: nil)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("pdfURLS: \(String(describing: pdfURLS))")
    }

    @IBAction func loadAction(_ sender: Any) {
        if let pdfURL = pdfURLS  {
            self.webView.loadFileURL(pdfURL, allowingReadAccessTo: pdfURL.deletingLastPathComponent())
        }
    }
}

誰かがこの問題について考えを持っていますか? enter image description here

画像参照が添付されています。非推奨のUIWebViewを使用すれば、そのような問題はありませんが、非推奨のライブラリは使用したくありません。

12
Raj Sharma

IOS版Firefoxでもこの問題が発生しました。

https://bugzilla.mozilla.org/show_bug.cgi?id=1516524

私はこのSO WebKitバグの投稿も参照しました:

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

当面の間、回避策を見つけました。

let previousZoomScale = webView.scrollView.zoomScale
let previousContentOffset = webView.scrollView.contentOffset

if let currentItem = webView.backForwardList.currentItem {
    webView.go(to: currentItem)
}

DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
    webView.scrollView.setZoomScale(previousZoomScale, animated: false)
    webView.scrollView.setContentOffset(previousContentOffset, animated: false)
}

基本的に、PDFを再描画する戻る/進む履歴リストからURLに再度アクセスし、スクロールビューの位置/ズームを復元します。これは素晴らしいことではありませんが、機能します。

3

viewWillAppearでPDFデータをリロードすることで解決しました。これまでのところ、それは機能します。データは最初にストレージ/ウェブからロードされます。

var data: Data?

override func viewWillAppear(_ animated: Bool) {
  super.viewWillAppear(animated)
  if let data = data {
    webView.load(data, mimeType: "application/pdf", characterEncodingName: "utf8", baseURL: URL(fileURLWithPath: ""))
  }
}
0
janh