3

Я пытаюсь использовать UICollectionView для отображения квадрата MyCollectionViewCell, который имеет анимированные GIF-файлы в UIImageView.Swift UICollectionViewCell Анимированный просмотр случайно пробел при прокрутке

Ряды и секции установки следующим образом:

override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 
    return 1 
} 

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

Я использую SwiftGif получить GIFs присвоенных клетки UIImageView так:

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 
} 

Все по большей части работает. Но моя проблема в том, что при прокрутке есть моменты, когда ячейка пуста, и GIF не появляется. В процессе отладки я добавил ярлык в ячейку, чтобы отобразить indexPath.item, как вы можете видеть в приведенном выше коде, чтобы убедиться, что ячейка не проходит и обнаружила, что метка всегда будет отображать indexPath даже если ячейка не отображает GIF.

Я проверил с регулярными изображениями, а не так:

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 
} 

и не было никаких вхождений пустых ячеек.

Еще более любопытно, когда я первоначально фактически построил GIF в collectionView(...cellForItemAtIndexPath) я не получил каких-либо проблем с пустыми клетками либо:

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 
} 

Эта оригинальная реализация работала бы, если бы не было на самом деле Процесс сборки GIF резко влияет на производительность прокрутки UICollectionView, что и заставило меня изменить реализацию в первую очередь.

Я подтвердил, что это не проблема с SwiftGif как я копировал этот вопрос в другом приложении с использованием анимация делает библиотеку и AnimatedView вместо UIImageView в MyCollectionViewCell и отображаются анимация вместо GIFs и получили то же самое выдавать с ячейками случайным образом показывая ничего вместо анимации при прокрутке через CollectionView.

Я попытался решение StackOverflow here и реализован пользовательский UICollectionViewFlowLayout так:

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 
    } 
} 

и назначен его в viewDidLoad() так:

self.collectionView?.collectionViewLayout = MyFlowLayout() 

В MyFlowLayout Я также попытался:

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

Я также испортил различные размеры ячеек (ширина 1 меньше высоты, высота 1 меньше ширины и т. Д.) И перепуталась с некоторыми комбинациями вставки разделов, но не смогла найти источник этой проблемы, из-за которой анимированное представление не было показывать.

Любая помощь будет оценена по достоинству. Спасибо

ответ

0

Я решил проблему, установив gifImageView.image = nil в collectionView(...cellForItemAtIndexPath) перед назначением изображения.

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 
} 

Не знаете, как и почему это исправлено, но оно работает сейчас.

Смежные вопросы