在启用分页的情况下使两个 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

如何在启用分页的情况下实现 UIScrollView 平铺?

在启用分页的情况下将表格视图添加到滚动视图。

尝试在启用分页的情况下访问 VESA LFB 时出现页面错误

在启用本机分页的情况下查看 UICollectionView 中的上一个/下一个单元格?

在启用分页的情况下检测滚动视图中的 y 偏移量何时发生变化