恢复 UIWebView 中的位置
Restore Position in UIWebView
我需要将当前位置存储在UIWebView到磁盘中,并在以后启动时从磁盘重新加载。
我之前所做的是使用 javascript 位置存储window.scrollX
和window.scrollY
。这在许多情况下都有效。
此外,我通过获取电流来存储秤:
webView.scrollView.zoomScale
并通过使用 JavaScript 将视口初始比例设置为它来恢复它。
所有这些都有效,但不可靠。有没有更好的方法?
我读过UIWebView
restorationIdentifier
,但我不确定是否可以将其保存到磁盘?
在 iOS 6 及更高版本中,如果为此视图的 恢复标识符属性,它尝试保留其 URL 历史记录、每个页面的缩放和滚动位置,以及 有关当前正在查看哪个页面的信息。在 还原时,视图将还原这些值,以便 Web 内容 出现时和以前一样。
从 Apple 编程指南和教程以及示例项目中查看更多信息。您可以运行它并将应用程序发送到后台,然后停止使用 Xcode 运行它,下次打开应用程序时,它会将其状态恢复到应用程序进入后台之前的状态。可以在示例项目上进行一个小修复,在viewDidAppear
中,如果self.restoringState
NO
,则调用showPage
函数。
需要明确的是,UIWebView 状态恢复(类似于正常状态恢复)的步骤如下:
- 在应用委托
application: shouldRestoreApplicationState
中,application: shouldSaveApplicationState
返回 true。 - 呈现的视图控制器 - 设置其恢复 ID - 您可以在情节提要的身份检查器中执行此操作。ID 可以是任何唯一字符串。如果您有容器 VC(导航等),则需要为其设置还原 ID。 在
- 情节提要中设置 UIWebView 的还原 ID
- 覆盖
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
- jquery试图按名称获取按钮位置
- 我可以获得相对于被点击元素的确切点击位置吗
- 谷歌地图固定位置覆盖
- 在单击任何位置时隐藏元素,而不检查每次DOM单击
- 正在阻止UIWebView警报
- 循环比赛位置算法
- es6 相当于下划线查找位置
- jQuery循环在特定位置暂停
- 引导程序:在导航栏中,显示悬停在单个位置的基于Li Link的不同内容
- 自定义函数中的光标位置
- 检测电话窃听,即:<a href="电话:xxx">在UIWebview上
- 安卓平台上的QWebView HTML5地理位置
- DIV并排,位置不正确
- 在UIWebView中获取HTML元素的位置
- 如何将哈希附加到 UIWebView 位置 href
- 恢复 UIWebView 中的位置
- 计算UIWebView中图像的宽度和高度、x和y位置
- 改变一个HTML元素在UIWebVIew中的位置
- 基于UIWebView中的位置,用javascript编程地获取元素,然后点击它们
- 如何处理警报单击从UIWebview生成的警报的位置