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
UIWebView 迁移后,WKWebView 中显示的 PDF 中的链接不起作用