ios - 在 UIPageViewController 中保留多个 UICollectionView 的滚动位置有哪些好方法?
问题描述
每次UIViewController
从当前页面滑出时,它都会被销毁。
如果UIViewController
再次刷回当前页面,它将再次重新创建。
但是,正如您从屏幕录制中看到的那样,UICollectionView
每次我们作为当前页面向后滑动时,滚动位置都会“丢失”。
我想知道,有什么好方法可以在 UIPageViewController 中保留多个 UICollectionView 的滚动位置?
- iOS 是否提供任何底层框架让我们实现这一点?
- 如果我们需要手动完成,我们应该何时将滚动位置保存
UICollectionView
在全局变量中?viewDidUnload
似乎不再被调用。 - 什么时候是恢复滚动位置的好时机?
viewDidLoad
?
谢谢。
解决方案
- iOS 是否提供任何底层框架让我们实现这一点?
不是真的,这需要手动处理。假设您将引入某种由根控制器实现的委托协议。
protocol ScrollPositionDelegate: class {
func collectionView(_ collectionView: UICollectionView, didChangeScrollPosition point: CGPoint)
}
然后所有子视图都会保持对委托的弱引用
weak var delegate: ScrollPositionDelegate?
并在位置发生变化时调用它。在根目录中,您可以通过使用 collectionView 上的属性来识别哪个视图调用了委托方法tag
(您需要首先在子屏幕中设置它)
extension RootViewController: ScrollPositionDelegate {
func collectionView(_ collectionView: UICollectionView, didChangeScrollPosition point: CGPoint) {
switch collectionView.tag {
case 1:
// store scroll position for screen 1
default:
return
}
// or simply
scrollPosition[collectionView.tag] = point
// obviously you would need storage like `scrollPosition: [Int: CGPoint]`
}
}
- 如果我们需要手动做,什么时候应该将 UICollectionView 的滚动位置保存在全局变量中?viewDidUnload 似乎不再被调用。
您可以在集合视图委托调用时viewWillDisappear
或当集合视图委托调用时保存值scrollViewDidScroll
- 什么时候是恢复滚动位置的好时机?视图加载?
viewDidLoad
开始是个好主意,但不能保证布局会准备好。viewWillAppear
您可以在致电时或致电后重试collectionView.reloadData()
推荐阅读
- jenkins - Jenkins Pipeline checkout and build on remote Docker host from Bitbucket commit
- java - T 类型的Java泛型集合,添加会引发编译错误,但检索和添加不会
- android - 如何在 Android 上使用 Kotlin 获取 Dagger 2 模块中的组件依赖项?
- symfony - 序列化和编码有什么区别?
- r - 如何使用 apply.daily/period.apply 计算 XTS 时间序列中每列的最大值?
- freemarker - Geoserver freemarker 模板语言检查文件链接
- django - Django:创建多项选择字段的最佳方法
- javascript - 最接近 ES6 的转换 jQuery 为 bg 添加 CSS
- javascript - 用 vanilla javascript 重新组织 json 数据
- unit-testing - 如何在 GOLANG 中获取多个文件的覆盖率