gpt4 book ai didi

ios - 照片框架和可重用的 UICollectionViewCell

转载 作者:搜寻专家 更新时间:2023-10-31 23:01:05 26 4
gpt4 key购买 nike

我有一个 UICollectionView 可以使用 Photos 框架显示设备相册中的照片。照片显示正确,但如果我快速滚动(比如当您在屏幕顶部用胶带转到 collectionView 的顶部时),我有一些照片不在正确的 indexPath 上。我只需要稍微滚动一下,将坏照片从屏幕上移开,一切就会恢复原状。

我在 prepareForReuse 期间通过取消当前请求来清理单元格。

我估计是PHImageManager的异步请求有问题,但我不知道如何避免这个问题。

这里是一些代码:

View Controller

extension AlbumDetailViewController : UICollectionViewDataSource {
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return photoList.count
}

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

let cell = collectionView.dequeueReusableCellWithReuseIdentifier("PhotoCell", forIndexPath: indexPath) as! PhotoCollectionCell

cell.setImage(photoList.objectAtIndex(indexPath.row) as! PHAsset)

return cell
}
}

自定义 CollectionViewCell

class PhotoCollectionCell: UICollectionViewCell {

@IBOutlet weak var imageView: UIImageView!

var requestId: PHImageRequestID!
let manager = PHImageManager.defaultManager()

override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}

override func prepareForReuse() {
self.imageView.image = nil

manager.cancelImageRequest(self.requestId)
}

func setImage(asset: PHAsset) {

let option = PHImageRequestOptions()

option.resizeMode = .Fast
option.deliveryMode = .HighQualityFormat

self.requestId = manager.requestImageForAsset(asset, targetSize: CGSize(width: self.frame.size.width * UIScreen.mainScreen().scale, height: self.frame.size.height * UIScreen.mainScreen().scale), contentMode: PHImageContentMode.Default, options: option, resultHandler: {(result, info)->Void in
self.imageView.image = result
})
}
}

谢谢

最佳答案

调用requestImageForAsset方法前,设置cell.tag等于indexPath.item,回调获取图片后,检查indexPath.item和cell.tag,如果匹配则执行
self.imageView.image = 结果。例如

        cell.tag = indexPath.item

if let asset = assets?[indexPath.item] {

let option = PHImageRequestOptions()
option.isSynchronous = false
option.resizeMode = .exact
option.isNetworkAccessAllowed = true

DispatchQueue.global(qos: .userInitiated).async {
manager.requestImage(for: asset, targetSize: Constant.targetSize, contentMode: .aspectFit, options: option, resultHandler: {(result, info)->Void in

DispatchQueue.main.async {

if cell.tag == indexPath.item {
cell.imageView.image = result
}
}
})
}
}

希望对你有帮助

关于ios - 照片框架和可重用的 UICollectionViewCell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35088847/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com