3

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

我之前所做的是将window.scrollXand存储在window.scrollY一个 javascript 位置。这适用于许多情况。

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

webView.scrollView.zoomScale

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

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

我阅读了关于UIWebView'srestorationIdentifier但我不确定是否可以将其保存到磁盘?

4

2 回答 2

3

在 iOS 6 及更高版本中,如果您为此视图的 restoreIdentifier 属性分配一个值,它会尝试保留其 URL 历史记录、每个页面的缩放和滚动位置以及有关当前正在查看的页面的信息。在恢复过程中,视图会恢复这些值,以便 Web 内容与之前一样显示。

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

于 2014-11-16T03:29:37.233 回答
1

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

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

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

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
        }
   }

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

请注意,我在 webview 中设置了滚动视图的恢复标识符,这样我就不必实现 VC 编码功能 - 可以通过 VC 编码/解码覆盖仅编码滚动视图偏移量。

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

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

于 2014-11-21T19:31:58.827 回答