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())
}
}
}
画像参照が添付されています。非推奨のUIWebViewを使用すれば、そのような問題はありませんが、非推奨のライブラリは使用したくありません。
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に再度アクセスし、スクロールビューの位置/ズームを復元します。これは素晴らしいことではありませんが、機能します。
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: ""))
}
}