首页 > 解决方案 > 在 UIPageViewController 中保留多个 UICollectionView 的滚动位置有哪些好方法?

问题描述

每次UIViewController从当前页面滑出时,它都会被销毁。

如果UIViewController 再次刷回当前页面,它将再次重新创建。

在此处输入图像描述

但是,正如您从屏幕录制中看到的那样,UICollectionView每次我们作为当前页面向后滑动时,滚动位置都会“丢失”。

我想知道,有什么好方法可以在 UIPageViewController 中保留多个 UICollectionView 的滚动位置?

  1. iOS 是否提供任何底层框架让我们实现这一点?
  2. 如果我们需要手动完成,我们应该何时将滚动位置保存UICollectionView在全局变量中?viewDidUnload似乎不再被调用。
  3. 什么时候是恢复滚动位置的好时机?viewDidLoad?

谢谢。

标签: iosswiftuicollectionview

解决方案


  1. 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]`
    }
} 
  1. 如果我们需要手动做,什么时候应该将 UICollectionView 的滚动位置保存在全局变量中?viewDidUnload 似乎不再被调用。

您可以在集合视图委托调用时viewWillDisappear或当集合视图委托调用时保存值scrollViewDidScroll

  1. 什么时候是恢复滚动位置的好时机?视图加载? viewDidLoad开始是个好主意,但不能保证布局会准备好。viewWillAppear您可以在致电时或致电后重试collectionView.reloadData()

推荐阅读