Я пытаюсь использовать 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 меньше ширины и т. Д.) И перепуталась с некоторыми комбинациями вставки разделов, но не смогла найти источник этой проблемы, из-за которой анимированное представление не было показывать.
Любая помощь будет оценена по достоинству. Спасибо