1

是否可以使两个集合视图同步滚动,如果可以,如何?

我有这个类,包含两个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)
            }
        }
    }
}

这是迄今为止最好的解决方案 - 但它仍然不是我想要的 - 这个滚动,当另一个集合视图完成滚动时..但我希望它们同步滚动:-)

有什么建议么?

4

1 回答 1

3

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

这里似乎发生的是,为第一个 CollectionView 调用了委托方法 scrollViewDidScroll,当 contentOffset 应用于另一个 CollectionView 时,再次调用委托方法并将滚动应用于原始 collectionView。您需要识别当时正在滚动哪个 collectionView。

为此,您可以利用isDraggingUIScrollView 的属性。

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)
    }
}
于 2017-03-02T14:23:23.187 回答