Swift UICollectionViewCell Vista animada aleatoriamente en blanco al desplazarse

Estoy intentando usar un UICollectionView para mostrar un cuadrado MyCollectionViewCell que tiene GIF animados en un UIImageView .

Las filas y las secciones están configuradas de la siguiente manera:

 override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { return 1 } override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 50 } 

Estoy usando SwiftGif para get GIFs asignados a UIImageView la celda así:

 let gifs = [UIImage.gifWithName("gif1"), UIImage.gifWithName("gif2"), UIImage.gifWithName("gif3")] override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier("gifCell", forIndexPath: indexPath) as! GifCollectionViewCell cell.gifImageView.image = gifs[indexPath.item % gifs.count] return cell } 

Todo en su mayor parte funciona muy bien. Pero mi problema es que cuando se desplaza, hay momentos en que la celda está en blanco y no aparece ningún GIF. En el process de debugging, agregué una label a la celda para mostrar indexPath.item , como se puede ver en el código anterior, para asegurarse de que la celda no se pase y haya encontrado que la label siempre se mostrará indexPath incluso si la celda no muestra un GIF.

He probado con imágenes regulares en lugar de eso:

 let testImages = [UIImage(named: "testImage1"), UIImage(named: "testImage2", UIImage(named: "testImage3")] override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier("gifCell", forIndexPath: indexPath) as! GifCollectionViewCell cell.gifImageView.image = testImages[indexPath.item % testImages.count] return cell } 

y no tenía apariciones de celdas en blanco.

Aún más curioso, cuando originalmente realmente construí el GIF en collectionView(...cellForItemAtIndexPath) , tampoco recibí ningún problema con las celdas en blanco:

 let gifNames = ["gif1", "gif2", "gif3"] override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier("gifCell", forIndexPath: indexPath) as! GifCollectionViewCell let gif = UIImage.gifWithName(gifNames[indexPath.item % gifNames.count]) cell.gifImageView.image = gif return cell } 

Esta implementación original habría funcionado si no fuera por el hecho de que el process de construcción de GIF afecta drásticamente el performance de desplazamiento de UICollectionView que es lo que me obligó a cambiar la implementación en primer lugar.

He confirmado que este no es un problema con SwiftGif ya que he replicado este problema en una aplicación diferente utilizando una biblioteca de renderizado de animation y una AnimatedView en lugar del UIImageView en MyCollectionViewCell y MyCollectionViewCell mostrado animaciones en lugar de GIF y he tenido el mismo problema con las celdas de forma aleatoria mostrando nada en lugar de la animation al desplazarse por CollectionView.

He probado la solución StackOverflow aquí e implementado un UICollectionViewFlowLayout personalizado así:

 class MyFlowLayout: UICollectionViewFlowLayout { override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? { let attributes = super.layoutAttributesForElementsInRect(rect) let contentSize = self.collectionViewContentSize() let newAttrs = attributes?.filter { $0.frame.maxX <= contentSize.width && $0.frame.maxY <= contentSize.height} return newAttrs } } 

Y lo asignó a viewDidLoad() así:

 self.collectionView?.collectionViewLayout = MyFlowLayout() 

En MyFlowLayout también he intentado:

 override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool { return true } 

También he ensuciado con varios tamaños de celdas (ancho 1 less que altura, altura 1 less que ancho, etc.) y he desorderado con algunas combinaciones de inserción de sección, pero no he podido encontrar el origen de este problema que está causando que la vista animada no aparecer.

Cualquier ayuda sería apreciada. Gracias

gifImageView.image = nil el problema configurando gifImageView.image = nil en collectionView(...cellForItemAtIndexPath) antes de asignar la image.

 override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier("gifCell", forIndexPath: indexPath) as! GifCollectionViewCell cell.gifImageView.image = nil // Added this line cell.gifImageView.image = gifs[indexPath.item % gifs.count] cell.infoLabel.text = String(indexPath.item) return cell } 

No estoy seguro de cómo / por qué esto lo solucionó, pero ahora funciona.