【问题标题】:WKWebView shows gray background and pdf content gets invisible on viewcontroller switchWKWebView 显示灰色背景并且 pdf 内容在 viewcontroller 开关上变得不可见
【发布时间】:2018-10-10 07:46:53
【问题描述】:

我正在从 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,则不会出现此类问题,但我不想使用已弃用的库。

【问题讨论】:

  • 也许您的 PDF 网址即将发布!
  • @iOSer 不,不是。如果我使用已弃用的 UIWebView,则不会出现此类问题,但我不想使用已弃用的库。
  • 我在 iPhone XR 模拟器上试过了,我遇到了问题。此外,在真实设备上,它实际上并没有工作。
  • 这一定是 iOS 12 的错误。当我回到视图时(最初加载正常之后),我也得到了灰屏。它发生在我尝试过的每个 iOS 12 模拟器以及我的 iOS 12 设备中。在 iOS 12 之前我从来没有遇到过这个问题。我检查了一个正常的网站是否可以正常工作(apple.com)并且可以。它似乎只不适用于 PDF...
  • 在 iOS 13.2.2 上检查过 问题仍未修复

标签: ios swift ipad wkwebview


【解决方案1】:

我们在 Firefox for iOS 中也遇到了这个问题:

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

我还在 WebKit 错误中引用了这篇 SO 帖子:

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,然后我们恢复滚动视图位置/缩放。它不是很好,但它有效。

【讨论】:

  • 尽管设置了 contentOffset 的值,但如果用户放大了内容,则 pdf 将返回到第一页。似乎设置 zoomScale 正在重置 contentOffset 出于某种原因,即使之前设置了 zoomScale内容偏移量:(
  • 谢谢,这帮助我应用了解决方法!我发现缩放和 contentOffset 的恢复应该在导航完成后应用(webView:didFinishNavigation),否则太多次它们的值没有正确恢复。即使在 'webView:didFinishNavigation' 中,我也必须使用 DispatchQueue.main 并延迟 50/100 毫秒。
【解决方案2】:

通过在 viewWillAppear 中重新加载 pdf 数据解决了这个问题。 到目前为止它有效。 数据首先从 storage/web 加载。

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: ""))
  }
}

【讨论】:

    猜你喜欢
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 2018-08-02
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 2021-11-10
    相关资源
    最近更新 更多