【问题标题】:Make two UICollectionView's scroll synchronously with paging enabled在启用分页的情况下使两个 UICollectionView 同步滚动
【发布时间】: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)
            }
        }
    }
}

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

有什么建议吗?

【问题讨论】:

    标签: ios swift uiscrollview uicollectionview scroll-paging


    【解决方案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,即使它不完全是我想要的 - 但我能得到的最接近的,我猜测:/
    • 但如果你有解决方案,我在听 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多