我正在尝试使用UICollectionView
来显示在MyCollectionViewCell
中设置动画GIF的方格UIImageView
。
行和部分的设置如下:
override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 50
}
我正在使用SwiftGif将GIF分配给单元格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
,正如您在上面的代码中所看到的,以确保该单元格没有被传递并找到即使单元格没有显示GIF,标签也将始终显示indexPath。
我已使用常规图像进行测试,而不是这样:
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
}
并且没有出现空白单元格。
更奇怪的是,当我最初在collectionView(...cellForItemAtIndexPath)
中实际构建GIF时,我没有遇到空白单元格的任何问题:
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
中复制了此问题并且显示动画而不是GIF,并且在滚动浏览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 :(得分: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
}
不确定如何/为什么修复它但它现在有效。