滚动出界时 WKWebView 会发生啥

Posted

技术标签:

【中文标题】滚动出界时 WKWebView 会发生啥【英文标题】:What happens to WKWebView when scrolled out of bounds滚动出界时 WKWebView 会发生什么 【发布时间】:2017-11-09 19:43:08 【问题描述】:

我正在使用分页滚动视图将不同的 Web 视图显示为页面。滚动视图已设置clipsToBounds = false 以允许在滚动视图中显示前一页和后一页。

当滚动页面时,有一个确切的时刻,WKWebViews 内容变得完全不可见。这恰好发生在 Web 视图离开滚动视图边界的那一刻(见下文)。在某些网站上,超出范围的可见内容与实际内容不同。

只有在使用 WKWebView 而不是 UIWebView 时才会出现这些问题(UIWebView 一切正常)。

有人遇到过类似的 WKWebView 问题并有解决方案吗?

编辑: Github 上现在有一个示例项目,您可以在其中体验该错误并尝试解决它: WKWebView test project

【问题讨论】:

这是一个有趣的错误。我确定有更好的解决方案,但我想您可以通过使用 UICollectionview 滚动并加载前三页来修复它。滚动后,您可以加载其他页面。 【参考方案1】:

要弄清楚我认为您需要使用 UICollectionView。 该单元格应与 WKWebView 一起存在,而它将在屏幕上。

1) 你需要像Here一样放置它

下一个问题将是使内容可分页。 2) 要做到这一点,您需要在您的集合上添加 UIScrollView,例如 Here

3) 之后,让你的 UIScrollView pageble 并在 viewdidload 中写入: collectionView.addGestureRecognizer(scrollView.panGestureRecognizer)

4) 在您收到用于在 UICollectionView 中显示的模型后 - 更新 UIScrollView 的 contentSize,例如

scrollView.contentSize = CGSize(width: (models.count*(cellWidth+cellIndent) + sectionIndent * 2), height: cellHeight)

5) 实现 UIScrollViewDelegate

extension YourVC: UIScrollViewDelegate 
    func scrollViewDidScroll(_ scrollView: UIScrollView) 
        if scrollView == self.scrollView 
            collectionView.contentOffset = scrollView.contentOffset
         else if scrollView == self.collectionView 
            self.scrollView.contentOffset = scrollView.contentOffset
        
    

就是这样。快乐编码 =)

【讨论】:

我希望有一个不那么复杂的解决方案,但这是可行的。我使用了普通的 UIView 而不是 UICollectionView。【参考方案2】:

WKWebView 被设计为比 UIWebView 性能更高。如果它不在视图层次结构的顶部,它将停止运行网页的某些部分或完全停止呈现它。这里的问题是,一旦网页超出了滚动视图的范围,WKWebView 不会认为自己在屏幕上,即使它通过设置clipsToBounds = false 是可见的。

最简单的方法是使用 UIWebView。如果出于某种原因您需要 WebKit,请考虑调整分页代码,使您的滚动视图跨越整个视图控制器。

【讨论】:

由于多种原因,我无法使用 UIWebView。此外,我不想使用被认为已弃用的组件。

以上是关于滚动出界时 WKWebView 会发生啥的主要内容,如果未能解决你的问题,请参考以下文章

从 iOS Swift 中的 cam 扫描仪 SDK 返回时,WKwebview 是空白屏幕?

iOS 13 beta 中 WKWebView 的内在内容大小问题

在 WKWebView 上滚动时 UINavigationBar/UIVisualEffectView 的模糊半透明效果?

滚动条的scroll事件和change事件有啥区别

如果没有在 Swift 中加载 URL,如何使 WKWebView 不可滚动?

WKWebView+contentInset 使内容大小错误