web-dev-qa-db-ja.com

indexPathのセルが画面UICollectionViewに表示されるかどうかを確認します

ユーザーに画像を表示するCollectionViewがあります。これらをバックグラウンドでダウンロードし、ダウンロードが完了したら、次のfuncを呼び出してcollectionViewCellを更新し、画像を表示します。

_func handlePhotoDownloadCompletion(notification : NSNotification) {
    let userInfo:Dictionary<String,String!> = notification.userInfo as! Dictionary<String,String!>
    let id = userInfo["id"]
    let index = users_cities.indexOf({$0.id == id})
    if index != nil {
        let indexPath = NSIndexPath(forRow: index!, inSection: 0)
        let cell = followedCollectionView.cellForItemAtIndexPath(indexPath) as! FeaturedCitiesCollectionViewCell
        if (users_cities[index!].image != nil) {
            cell.backgroundImageView.image = users_cities[index!].image!
        }
    }
}
_

これは、セルが現在画面に表示されている場合は問題なく機能しますが、表示されない場合は、次の行で_fatal error: unexpectedly found nil while unwrapping an Optional value_エラーが発生します。

_ let cell = followedCollectionView.cellForItemAtIndexPath(indexPath) as! FeaturedCitiesCollectionViewCell
_

この場合、とにかく画像がcellForItemAtIndexPathメソッドで設定されるため、collectionViewCellがまだ表示されていない場合でも、この関数を呼び出す必要はありません。

したがって、私の質問、この関数を変更して、処理しているセルが現在表示されているかどうかを確認する方法を教えてください。 collectionView.visibleCells()は知っていますが、ここでどのように適用するかわかりません。

10
Alk

現在利用可能なセルを取得

// get visible cells 
let visibleIndexPaths = followedCollectionView.indexPathsForVisibleItems()

次に、セルを操作する前に、indexPathvisibleIndexPathsに含まれているかどうかを確認します。

20
tuledev

ネストされたUICollectionViewsはまったくスクロールしない必要があるため、contentOffsetが提供されないため、iOSはすべてのセルを常に表示されていると認識します。その場合、画面の境界を参考にすることができます。

    let cellRect = cell.contentView.convert(cell.contentView.bounds, to: UIScreen.main.coordinateSpace)
    if UIScreen.main.bounds.intersects(cellRect) {
        print("cell is visible")
    }
7
Fran Pugl

単にif collectionView.cellForItem(at: indexPath) == nil { }を使用できます。 collectionViewは、表示されている場合にのみセルを返します。

またはあなたの場合は具体的に変更します:

let cell = followedCollectionView.cellForItemAtIndexPath(indexPath) as! FeaturedCitiesCollectionViewCell

に:

if let cell = followedCollectionView.cellForItemAtIndexPath(indexPath) as? FeaturedCitiesCollectionViewCell { }
2
Scott Fister