UICollectionViewで取得する visibleCells のうち、”完全に”表示されているcellのみを抜き出してみます。
ここでの”完全に”は、cellが一切、スクロールの範囲外にはみ出ていないことを指します。

    let perfectVisibleCells = collectionView.visibleCells().filter {
        CGRectContainsRect(collectionView.bounds, $0.frame)
    }

こうすることで、visibleCells のうち、”完全に”表示されているcellのみを抜き出すことができます。
何かしらのタイミングで、完全に表示されているcellにはこの処理を、はみ出てしまったらこの処理を、なんてことが出来そうです。
少し工夫すれば、cellの高さの半分以上はみでたら、なんていう風にもできそうです!



実は

昔、teratailで自分が回答で書いたものを再掲させて頂きました。