恢复 UIWebView 中的位置

Restore Position in UIWebView

本文关键字:位置 UIWebView 恢复      更新时间:2023-09-26

我需要将当前位置存储在UIWebView到磁盘中,并在以后启动时从磁盘重新加载。

我之前所做的是使用 javascript 位置存储window.scrollXwindow.scrollY。这在许多情况下都有效。

此外,我通过获取电流来存储秤:

webView.scrollView.zoomScale

并通过使用 JavaScript 将视口初始比例设置为它来恢复它。

所有这些都有效,但不可靠。有没有更好的方法?

我读过UIWebView restorationIdentifier,但我不确定是否可以将其保存到磁盘?

在 iOS 6 及更高版本中,如果为此视图的 恢复标识符属性,它尝试保留其 URL 历史记录、每个页面的缩放和滚动位置,以及 有关当前正在查看哪个页面的信息。在 还原时,视图将还原这些值,以便 Web 内容 出现时和以前一样。

从 Apple 编程指南和教程以及示例项目中查看更多信息。您可以运行它并将应用程序发送到后台,然后停止使用 Xcode 运行它,下次打开应用程序时,它会将其状态恢复到应用程序进入后台之前的状态。可以在示例项目上进行一个小修复,在viewDidAppear中,如果self.restoringState NO,则调用showPage函数。

需要明确的是,UIWebView 状态恢复(类似于正常状态恢复)的步骤如下:

  1. 在应用委托application: shouldRestoreApplicationState 中,application: shouldSaveApplicationState返回 true。
  2. 呈现的视图控制器 - 设置其恢复 ID - 您可以在情节提要的身份检查器中执行此操作。ID 可以是任何唯一字符串。如果您有容器 VC(导航等),则需要为其设置还原 ID。
  3. 情节提要中设置 UIWebView 的还原 ID
  4. 覆盖applicationFinishedRestoringState并重新加载webView

我使用了这些步骤,一切似乎都正常。但是,在阅读您的评论后,我发现您在缩放页面时遇到了问题。问题是UIWebView恢复中的一个错误(我认为),它与重新加载机制有关。这就是为什么我建议以下技巧:

import UIKit
class ViewController: UIViewController, UIWebViewDelegate {
    @IBOutlet var webView: UIWebView!
    override func viewDidLoad() {
        super.viewDidLoad()
        webView.delegate = self
        webView.scrollView.restorationIdentifier = "webViewScrollView"
    }
    var restoring = false
    override func viewDidAppear(animated: Bool) {
        if !restoring {
            webView.loadRequest(NSURLRequest(URL: NSURL(string: "http://google.com")!))
        }
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    var restoredScrollOffset: CGPoint = CGPoint.zeroPoint
    override func applicationFinishedRestoringState() {
        restoring = true
        restoredScrollOffset = webView.scrollView.contentOffset
        webView.reload()
    }
    func webViewDidFinishLoad(webView: UIWebView) {
        if restoring {
            restoring = false
            if webView.scrollView.contentOffset != restoredScrollOffset {
                println("bug - sometimes it may happen")
            }
            webView.scrollView.contentOffset = restoredScrollOffset
        }
   }

因为这是一个黑客,我们不能确定它会完美无缺:)

请注意,我在 Web 视图中设置了滚动视图的还原标识符,这样我就不必实现 VC 编码函数 - 可以通过 VC 编码/解码覆盖仅对滚动视图偏移量进行编码。

我只设置滚动视图偏移

量;如果您对缩放比例有问题(我在尝试过的任何网页中都没有找到),您可以在设置滚动视图内容偏移的同一位置设置比例

代码在 https://github.com/iamdoron/UIWebViewRestoration