我正在使用 WKWebView
作为应用程序中的中央文档对象,而不仅仅是作为 Web 的被动门户。同一个文档出现在应用程序的几个不同位置,因此理想情况下, View 将像基于 UIView
的原生 UIKit
一样高效地呈现。
为了避免 URL 加载延迟,我尝试的是集中缓存 View ,然后当发生导航转换并且新的父 View 自行构建时,它会从缓存中获取现有的 WKWebView
并添加它作为一个 subview ,这当然会从以前的 super View 中删除它。假设可以将它从之前的 super View 中删除,因为后者不再可见。
我注意到这有时有效,但大多数时候网页在其新层次结构中非常不满意——它似乎应用了随机缩放和平移,留下了巨大的空白,或者多次出现过大,或正确尺寸的一半。重新应用在原始 super View 中完美运行的相同程序化 NSLayoutConstraints
,frame
的手动几何操作,setNeedsLayout()
, setNeedsDisplay()
在从新的父 VC 的生命周期方法调用时全部无效。
很明显,WKWebView 有很深的内部状态,我不知道如何重置才能让它在新家开心。这是不是找错人了?我应该依赖 HTTP 库级缓存吗?
目标是避免重新呈现包含 HTTP 事务、文档呈现算法和所有固有延迟的页面。毕竟它被计算过一次。我希望避免冗余计算和网络流量。
最佳答案
我也看到了。 将 WKWebView 从一个父级移动到另一个父级(导航 Controller 的 View )会导致内部 ScrollView contentInset 更新不正确(不遵守导航 Controller 的 automaticallyAdjustsScrollViewInsets = false)。
我所做的是对 WKWebView 进行子类化,并将这一点添加到类中:
override func layoutSubviews() {
self.scrollView.contentInset = .zero
super.layoutSubviews()
}
关于ios - 在一个 VC 上显示后重新设置 WKWebView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36845238/