如何在scrollViewDidScroll回调中滚动到单元格?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在scrollViewDidScroll回调中滚动到单元格?相关的知识,希望对你有一定的参考价值。

我有以下功能,当显示单元格时,我将时间轴自动滚动到最后一个可能的单元格。

var onceOnly = false
internal func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    if !onceOnly {
        let indexToScrollTo = IndexPath(row: self.posts.count - 1, section: 0)
        collectionView.scrollToItem(at: indexToScrollTo, at: .left, animated: false)
        let firstPost = posts.first?.timeStamp
        let firstOfFirstMonth = firstPost?.startOfMonth()
        let diff = posts.last?.timeStamp.months(from: firstOfFirstMonth!)
        //self.currentPostMonth = diff
        let monthCellIndexPath = IndexPath(row: diff!, section: 0)
        timeline.scrollToItem(at: monthCellIndexPath, at: .centeredHorizontally, animated: false)
        onceOnly = true
    }
} 

然后我想检测我的时间轴何时完成滚动,一旦它有,请调用该单元格上的特定方法(cell.drawArrow)

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView == self.timeline {
        let months = self.posts.first?.timeStamp.startOfMonth().months(from: (self.posts.last?.timeStamp)!)
        let monthCellIndexPath = IndexPath(row: months!, section: 0)
        print("cells are",self.timeline.visibleCells)
        if let optionalCell = self.timeline.cellForItem(at: monthCellIndexPath) {
            let cell = optionalCell as! TimelineMonthViewCell
            let day = Calendar.current.component(.day, from: self.currentPostDate!)
            cell.drawArrow(day: day)
        } else {
            print("cell out of range")
        }
    }
}

现在它打印“细胞是[]”,“细胞超出范围”。因此它找到了一个空的可见单元格数组,无法找到它在屏幕上显示的范围内的最后一个单元格。我认为这可能意味着它在加载可见细胞之前尝试执行此操作?即使我相信回调应该在加载后调用它们考虑滚动到它们?

无论如何我该怎么做?

答案

事件的顺序是:

let indexToScrollTo = IndexPath(row: self.posts.count - 1, section: 0)
collectionView.scrollToItem(at: indexToScrollTo, at: .left, animated: false)
// callback
// more work to do

所以在完成你的工作之前回调就到了。

没有动画,所以你不需要回调,任何情况下这都是错误的回调。如果还有更多工作要做,那就去做吧。

以上是关于如何在scrollViewDidScroll回调中滚动到单元格?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 scrollViewDidScroll 中添加 UIView 并使其滚动到最后?

如何从 UIViewController 访问 scrollViewDidScroll

scrollViewDidScroll(_ scrollView: UIScrollView) 到达底部后如何保持 UIButton 浮动?

如何从 UICollectionViewController 中的 scrollViewDidScroll 方法访问单元格成员(用于动画)?

在uitableview中调用scrollviewdidscroll方法?

视差 UIScrollView – 在一个 scrollViewDidScroll 方法中处理两个视图?