在UIWebView中恢复位置

时间:2014-11-13 23:42:19

标签: javascript ios iphone uiwebview state-restoration

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

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

另外,我通过获取当前值来存储比例:

webView.scrollView.zoomScale

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

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

我读过有关UIWebView restorationIdentifier的信息,但我不确定是否可以将其保存到磁盘上?

2 个答案:

答案 0 :(得分:3)

  

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

Apple Programming Guidetutorial查看更多内容以及示例项目。您可以运行它并将应用程序发送到后台,然后停止使用Xcode运行它,下次打开应用程序时,它会将状态恢复到应用程序进入后台之前的状态。在viewDidAppear中,如果self.restoringStateNO,您可以调用showPage函数,对示例项目进行小规模修复。

答案 1 :(得分:1)

为了清楚起见,UIWebView状态恢复的步骤(类似于正常状态恢复)如下:

  1. 在您的应用代理application: shouldRestoreApplicationState中,application: shouldSaveApplicationState返回true。
  2. 提供视图控制器 - 设置其恢复ID - 您可以在故事板的身份检查器中执行此操作。 ID可以是任何唯一的字符串。如果您有容器VC(导航等),则需要为其设置恢复ID。
  3. 在故事板中设置UIWebView的恢复ID
  4. 覆盖applicationFinishedRestoringState并重新加载webView
  5. 我使用了这些步骤,一切似乎都有效。但是,在阅读您的评论后,我发现您在缩放页面时遇到了问题。问题是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
            }
       }
    

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

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

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

    代码位于https://github.com/iamdoron/UIWebViewRestoration