我需要将UIWebView中的当前位置存储到磁盘,并在以后的启动时从磁盘重新加载。
我之前做的是将window.scrollX
和window.scrollY
存储在javascript位置。
这适用于许多情况。
另外,我通过获取当前值来存储比例:
webView.scrollView.zoomScale
并通过使用javascript将视口初始比例设置为它来恢复它。
所有这些都有效,但并不可靠。有更好的方法吗?
我读过有关UIWebView
restorationIdentifier
的信息,但我不确定是否可以将其保存到磁盘上?
答案 0 :(得分:3)
在iOS 6及更高版本中,如果为此视图指定值 restoreIdentifier属性,它会尝试保留其URL 历史记录,每个页面的缩放和滚动位置,以及 有关当前正在查看哪个页面的信息。中 恢复时,视图会恢复这些值以便Web内容 就像以前一样出现。
从Apple Programming Guide和tutorial查看更多内容以及示例项目。您可以运行它并将应用程序发送到后台,然后停止使用Xcode运行它,下次打开应用程序时,它会将状态恢复到应用程序进入后台之前的状态。在viewDidAppear
中,如果self.restoringState
为NO
,您可以调用showPage
函数,对示例项目进行小规模修复。
答案 1 :(得分:1)
为了清楚起见,UIWebView状态恢复的步骤(类似于正常状态恢复)如下:
application: shouldRestoreApplicationState
中,application: shouldSaveApplicationState
返回true。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
}
}
因为它是一个黑客,我们无法确定它会完美无缺:)
请注意,我在webview中设置了滚动视图的恢复标识符,因此我不必实现VC编码功能 - 它可以通过VC编码仅编码滚动视图偏移/ decode覆盖。
我只设置滚动视图偏移量;如果您在缩放比例方面遇到问题(我在我试过的任何网页中都找不到),您可以在我设置滚动视图的内容偏移量的同一位置设置比例