我正在构建一个在UICollectionView中显示gif的应用程序。我正在使用Alamofire以及来自FlipBoard的FLAnimatedImage。我得到一个gif网址列表,然后设置获取的图像。
当我运行它时,只有我第一页上的第一个单元格正常工作。当我滚动到第二页时,相同(重用的单元格)是唯一正在工作的单元。我通过打印单元格的内存地址来检查这一点,它是唯一一个显示正确图像的地址。
我不认为这是FLAnimatedImage的问题,因为我尝试使用普通的UIImage,但它仍然有这种行为。我怀疑它与我的UICollectionViewCell子类有关。在我的故事板中,我尝试了引用我的UICollectionViewCell的子类,并且没有在界面中使用UICollectionViewCell。
Gif数据模型
class GifData : NSObject {
let id : String
let url : String
init(id: String, url: String) {
self.id = id
self.url = url
}}
集合视图控制器
override func viewDidLoad() {
super.viewDidLoad()
self.collectionView!.registerClass(MyCollectionViewCell.self, forCellWithReuseIdentifier: myReuseIdentifier)
Alamofire.request(.GET, "http://api.giphy.com/v1/gifs/search",
parameters: ["q":"hello", "api_key": "dc6zaTOxFJmzC", "limit" : "29"])
.responseJSON { response in
if let JSON = response.result.value {
let gifData = (JSON.valueForKey("data") as! [NSDictionary])
.map {
GifData(id: $0["id"] as! String, url: $0["images"]!["fixed_width_small_still"]!!["url"] as! String)
}
self.gifUrls.addObjectsFromArray(gifData)
self.collectionView?.reloadData()
}
}
}
集合查看数据源
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return gifUrls.count
}
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(cakeReuseIdentifier, forIndexPath: indexPath) as! CakeCollectionViewCell
if (self.gifUrls.count != 0) {
Alamofire.request(.GET, (self.gifUrls.objectAtIndex(indexPath.row) as! GifData).url)
.response(completionHandler: { (request, response, data, error) -> Void in
cell.animatedImageView.animatedImage = FLAnimatedImage(animatedGIFData: data!)
})
return cell
}
return cell
}
我的CollectionViewCell
class CakeCollectionViewCell: UICollectionViewCell {
var animatedImageView = FLAnimatedImageView()
override init(frame: CGRect) {
super.init(frame: frame)
self.animatedImageView.frame = self.frame
self.contentView.addSubview(animatedImageView)
self.contentView.clipsToBounds = true
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func prepareForReuse() {
super.prepareForReuse()
self.animatedImageView.animatedImage = nil
}}
答案 0 :(得分:0)
您发布的代码存在一些问题,但首先回答您的具体问题:
override init(frame: CGRect) {
super.init(frame: frame)
self.animatedImageView.frame = self.frame
self.animatedImageView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] // add this line
self.contentView.addSubview(animatedImageView)
self.contentView.clipsToBounds = true
}
我怀疑如果在单元格的init函数中放置一个断点,你会发现它的初始帧大小为零。添加自动调整大小遮罩将允许您的图像视图在内容视图更改大小时更改大小。
对于另一个主要问题,我认为你会发现你的代码...想象一下,如果一个单元格在GET请求完成之前被重用,并且第二个GET请求重用的单元格在第一个单元格之前完成...你会结束显示该单元格的错误GIF。这种情况不会经常发生,但我希望它会发生,如果你不知道它是可能的话,就无法追查。