滚动出界时 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 的模糊半透明效果?