WKWebView 显示灰色背景并且 pdf 内容在 viewcontroller 开关上变得不可见

Posted

技术标签:

【中文标题】WKWebView 显示灰色背景并且 pdf 内容在 viewcontroller 开关上变得不可见【英文标题】:WKWebView shows gray background and pdf content gets invisible on viewcontroller switch 【发布时间】: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 上检查过 问题仍未修复 【参考方案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: ""))
  

【讨论】:

以上是关于WKWebView 显示灰色背景并且 pdf 内容在 viewcontroller 开关上变得不可见的主要内容,如果未能解决你的问题,请参考以下文章

在 WkWebview 加载时保持 LaunchScreen

iOS 加载PDF问题无法显示电子章问题

UIWebView 迁移后,WKWebView 中显示的 PDF 中的链接不起作用

WKWebView 将 pdf 保存到 ibooks,从链接保存 pdf

Chrome Html5 视频无法显示白色,背景为灰色

WKWebView 可水平滚动