在启用分页的情况下使两个 UICollectionView 同步滚动
Posted
技术标签:
【中文标题】在启用分页的情况下使两个 UICollectionView 同步滚动【英文标题】:Make two UICollectionView's scroll synchronously with paging enabled 【发布时间】:2017-03-02 13:59:06 【问题描述】:是否可以让两个collectionviews同步滚动,如果可以,怎么做?
我有这个类,包含两个collectionviews - 一个带有日期,另一个包含tableview,其元素与第一个collectionview 中的日期匹配。 当我滚动日期或元素时,我希望它们彼此跟随。
这是一些代码,以及到目前为止我尝试过的,但没有任何运气:
我将 ScrollViewDelegate 添加到我的班级,并尝试了这种委托方法:
func scrollViewDidScroll(scrollView: UIScrollView)
if scrollView.isEqual(dayCollectionView)
var offset = contentCollectionView.contentOffset
offset.x = dayCollectionView.contentOffset.x
contentCollectionView.setContentOffset(offset, animated: true)
else
var offset = dayCollectionView.contentOffset
offset.x = contentCollectionView.contentOffset.x
dayCollectionView.setContentOffset(offset, animated: true)
这个方法有一些工作原理,但是滚动视图只是在思考,并且似乎无法停止滚动,当它们第一次开始滚动时..
我也试过这个:
func scrollViewDidEndDecelerating(scrollView: UIScrollView)
if scrollView.isEqual(dayCollectionView)
// Days
for cell in self.dayCollectionView.visibleCells()
if let indexPath = dayCollectionView.indexPathForCell(cell)
contentCollectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: .None, animated: true)
else
// Classes
for cell in self.contentCollectionView.visibleCells()
if let indexPath = contentCollectionView.indexPathForCell(cell)
dayCollectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: .None, animated: true)
这是迄今为止最好的解决方案 - 但它仍然不是我想要的 - 这个滚动,当另一个集合视图完成滚动时。但我希望它们同步滚动:-)
有什么建议吗?
【问题讨论】:
【参考方案1】:确实,scrollViewDidScroll(_:)
方法是处理这种体验的最佳方法。
这里似乎发生的是,为第一个 CollectionView 调用了委托方法 scrollViewDidScroll,当 contentOffset 应用于另一个 CollectionView 时,再次调用委托方法并将滚动应用于原始 collectionView。您需要识别当时正在滚动哪个 collectionView。
为此,您可以使用 UIScrollView 的isDragging
属性。
func scrollViewDidScroll(scrollView: UIScrollView)
if scrollView.isEqual(dayCollectionView), scrollView.isDragging
var offset = contentCollectionView.contentOffset
offset.x = dayCollectionView.contentOffset.x
contentCollectionView.setContentOffset(offset, animated: true)
else if scrollView.isEqual(contentCollectionView), scrollView.isDragging
var offset = dayCollectionView.contentOffset
offset.x = contentCollectionView.contentOffset.x
dayCollectionView.setContentOffset(offset, animated: true)
【讨论】:
谢谢伙计!我没有完全工作,但我认为这是因为我启用了分页.. 所以我想我会坚持做它的 scrollViewDidEndDecelerating,即使它不完全是我想要的 - 但我能得到的最接近的,我猜测:/ 但如果你有解决方案,我在听 ;)以上是关于在启用分页的情况下使两个 UICollectionView 同步滚动的主要内容,如果未能解决你的问题,请参考以下文章
如何在启用分页的情况下实现 UIScrollView 平铺?
尝试在启用分页的情况下访问 VESA LFB 时出现页面错误