要保留嵌套collectionView的滚动位置,可以使用以下解决方法:
首先,在父collectionView的数据源方法collectionView(_:cellForItemAt:)
中,为每个子collectionView设置一个唯一的标识符(例如,使用子collectionView的index作为标识符),然后在每次创建子collectionView的时候,检查是否存在已保存的滚动位置,并将该位置应用到子collectionView。
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ParentCell", for: indexPath) as! ParentCell
// 设置子collectionView的代理
cell.childCollectionView.delegate = self
cell.childCollectionView.dataSource = self
// 设置子collectionView的标识符
cell.childCollectionView.tag = indexPath.item
// 恢复子collectionView的滚动位置
if let scrollPosition = scrollPositions[indexPath.item] {
cell.childCollectionView.contentOffset = scrollPosition
}
return cell
}
接下来,在子collectionView的滚动代理方法scrollViewDidScroll(_:)
中,动态保存当前滚动位置。
func scrollViewDidScroll(_ scrollView: UIScrollView) {
// 保存当前子collectionView的滚动位置
if let collectionView = scrollView as? UICollectionView {
let scrollPosition = collectionView.contentOffset
scrollPositions[collectionView.tag] = scrollPosition
}
}
最后,在需要恢复滚动位置的时候,重新加载父collectionView,并在数据源方法中应用之前保存的滚动位置。
// 恢复滚动位置
scrollPositions.removeAll() // 清空滚动位置数据
parentCollectionView.reloadData() // 重新加载父collectionView
这样,当重新加载父collectionView时,子collectionView会根据之前保存的滚动位置来恢复滚动位置。
上一篇:保留前导零的VBA
下一篇:保留嵌套的导航器路由并进行热重载