在一个VC上显示WKWebView之后重新生成WKWebView

时间:2016-04-25 15:44:07

标签: ios swift caching wkwebview

我在应用程序中使用WKWebView作为中心文档对象,而不仅仅是作为Web的被动门户。相同的文档显示在应用程序的几个不同位置,因此理想情况下,视图将与基于UIKit的本地UIView一样高效地呈现。

为了避免URL加载延迟,我尝试的是集中缓存视图,然后当发生导航转换并且新的父视图自行构建时,它将现有的WKWebView从缓存中删除并将其添加为subview,当然会将其从之前的superview中删除。假设可以从之前的超级视图中删除它,因为后者不再可见。

我注意到这有时 ,但大多数情况下网页在新的层次结构中非常不满意 - 它似乎应用了随机比例和翻译,留下了巨大的空白,或出现太多次,或正确尺寸的一半。重新应用在原始超级视图中完美运行的相同编程NSLayoutConstraintsframesetNeedsLayout()setNeedsDisplay()的手动几何操作在从新调用时都无效父VC的生命周期方法。

显然,WKWebView存在深层内部状态,我无法弄清楚如何重置以使其在新家中感到高兴。这只是在错误的树上吠叫?我应该依赖HTTP库级缓存吗?

目标是避免重新呈现包含HTTP事务,文档呈现算法和所有固有延迟的页面。毕竟它已被计算过一次。我希望避免冗余计算和网络流量。

1 个答案:

答案 0 :(得分:0)

我也是这样看的。 将WKWebView从一个父级移动到另一个父级(导航控制器的视图)会导致内部scrollview contentInset无法正确更新(不会从导航控制器中自动遵循AddAdjustsScrollViewInsets = false)。

我所做的是将WKWebView子类化,并将此位添加到该类中:

override func layoutSubviews() {
    self.scrollView.contentInset = .zero
    super.layoutSubviews()
}