如何查看已滚动的UICollectionView单元格

时间:2017-04-26 03:46:17

标签: ios swift uicollectionview

我有一个帖子的集合视图。我希望能够跟踪当前用户查看的帖子。如何避免某些问题,例如快速滚动,这些问题不允许我使用末端减速。

我们的想法是了解所有已通过屏幕用户可见区域的单元格。我的收集细胞是全屏的。 有什么想法吗?

3 个答案:

答案 0 :(得分:0)

我认为您可以使用willDisplay来跟踪开始时间显示单元格

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {

    // Save start time view at indexPath.
}

使用didEndDisplaying跟踪结束时间显示单元格

func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {

    // End time at indexPath
    // End - Start time > "time of view" => Viewed
}

答案 1 :(得分:0)

这对我有类似的功能,currentVisibleIndex保存已查看的collectionView单元格的索引值。对于您的实现,您可以维护一个数组,其中包含已查看的单元格的索引

func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>){
        /* set pagewidth to collectionview cell width*/
        let pageWidth = Float(collectionView.bounds.width)
        let currentOffset : Float = Float(scrollView.contentOffset.x)
        let targetOffset = Float(targetContentOffset.memory.x)
        var newTargetOffset : Float = 0.0

    if targetOffset > currentOffset {
        newTargetOffset = ceilf(currentOffset/(pageWidth)) * pageWidth
        /* if collectionview swipped right increment the curentlyVisibleIndex*/
        if currentlyVisibleIndex != (arrayOfModelForCollectionView.count - 1) {
            currentlyVisibleIndex += 1
        }
    }
    else{
        newTargetOffset = floorf(currentOffset/(pageWidth)) * pageWidth
        /*if collectionview swipped left decrement the currentlyVisibleCounter */
        if currentlyVisibleIndex !=  0 {
            currentlyVisibleIndex -= 1
        }
    }
    if newTargetOffset < 0{
        newTargetOffset = 0
    }else if  newTargetOffset > Float(scrollView.contentSize.width){
        newTargetOffset = Float(scrollView.contentSize.width)
    }
    targetContentOffset.memory.x = CGFloat(currentOffset)
    scrollView.setContentOffset(CGPoint(x: CGFloat(newTargetOffset), y: 0), animated: true)
}

答案 2 :(得分:0)

由于您的UICollectionViewCell是全屏,因此您可以执行UIScrollView委托方法scrollViewDidScroll并计算当前可见的单元格。像这样:

func scrollViewDidScroll(_ scrollView: UIScrollView) {

    let index = scrollView.contentOffset.y/view.bounds.size.height
}

这将显示当前向用户显示的索引。由于将始终调用scrollViewDidScroll,因此您可以使用此方法来确定用户当前所在的索引。