如何确定自定义UICollectionViewCell何时在屏幕上100%

时间:2017-10-19 12:29:23

标签: ios swift uicollectionview uicollectionviewcell

enter image description here

从上图中我UICollectionView有4个自定义单元格。任何时候屏幕上都可以有2或3个单元格。我怎么知道"单元格1"或"单元格2"是100%在屏幕上?

两者

collectionView.visibleCells
collectionView.indexPathsForVisibleItems

返回数组并且不会告诉您屏幕上100%的单元格。

对于图像,以下内容将显示在didSelectItemAt

collectionView.visibleCells

[<Shot_On_Goal.MainCollectionViewCell: 0x101f525c0; baseClass = UICollectionViewCell; frame = (190 7.66667; 454 350); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x1c0237300>>, <Shot_On_Goal.HeaderCollectionViewCell: 0x101f4d580; baseClass = UICollectionViewCell; frame = (10 0; 170 365); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x1c0236800>>, <Shot_On_Goal.TheirHockeyNetCollectionViewCell: 0x101f55520; baseClass = UICollectionViewCell; frame = (654 7.66667; 454 350); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x1c0238fe0>>]

collectionView.indexPathsForVisibleItems

[[0, 1], [0, 0], [0, 2]] 

3 个答案:

答案 0 :(得分:9)

这将为完全可见的单元格返回一个IndexPaths数组:

func fullyVisibleCells(_ inCollectionView: UICollectionView) -> [IndexPath] {

    var returnCells = [IndexPath]()

    var vCells = inCollectionView.visibleCells
    vCells = vCells.filter({ cell -> Bool in
        let cellRect = inCollectionView.convert(cell.frame, to: inCollectionView.superview)
        return inCollectionView.frame.contains(cellRect) 
    })

    vCells.forEach({
        if let pth = inCollectionView.indexPath(for: $0) {
            returnCells.append(pth)
        }
    })

    return returnCells

}

@IBAction func test(_ sender: Any) {

    let visCells = fullyVisibleCells(self.collectionView)
    print(visCells)

}

答案 1 :(得分:1)

您可以过滤您的visibleCells数组,以检查您的单元格框架是否包含在collectionView的框架中:

    var visibleCells = self.collectionView?.visibleCells
    visibleCells = visibleCells?.filter({ cell -> Bool in
        return self.collectionView?.frame.contains(cell.frame) ?? false
    })
    print (visibleCells)

答案 2 :(得分:0)

这是对它的扩展,基于don DonMag的回答:

extension UICollectionView {
    var fullyVisibleCells : [UICollectionViewCell] {
        return self.visibleCells.filter { cell in
            let cellRect = self.convert(cell.frame, to: self.superview)
            return self.frame.contains(cellRect) }
    }
}