在启用分页的同时进行两个UICollectionView的滚动

时间:2017-03-02 13:59:07

标签: ios swift uiscrollview uicollectionview scroll-paging

是否可以同时滚动两个集合视图,如果是,怎么样?

我有这个类,包含两个集合视图 - 一个带有日期,另一个带有tableview,其元素与第一个集合视图中的日期相匹配。 当我滚动日期或元素时,我希望它们相互跟随。

这是一些代码,到目前为止我尝试过的,但没有运气:

我将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 个答案:

答案 0 :(得分:1)

事实上,方法scrollViewDidScroll(_:)是处理这种体验的最佳方法。

这里似乎发生的是为第一个CollectionView调用了委托方法scrollViewDidScroll,当contentOffset应用于另一个CollectionView时,再次调用委托方法并将scroll应用于原始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)
    }
}