Bol*_*ion 4 ios uicollectionviewcell swift phasset xcode9
我有一个UICollectionView自定义UICollectionViewCell,它应该从UIImageView单元格中的每个照片中获取并显示缩略图(低质量)照片(通常用户可以选择 1 张以上的照片)。
我一直在玩PHImageRequestOptions和它们的属性,阅读它们。我什至nil作为requestImage(for: PHAsset)方法的参数传递了这一点,因为我不确定我错在哪里。
问题是该requestImage(for: PHAsset)方法被调用了两次。我需要第一次调用它只是在每个集合视图单元格中设置图像质量低(缩略图图像),一旦全尺寸图像准备好,它应该被添加到一个名为assetsTurnedIntoImages. 问题是我做错了,我总是得到两次调用if该else方法,所以基本上,如果我从相机胶卷中选择了 4 张图像(因此,我在资产数组中有 4 张图像)以及何时通过 requestImage(for: asset) 方法我得到 8 个图像assetsTurnedIntoImages而不是 4 个。所以这是我的代码
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
print("Assets count is:", assets.count)
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PhotoPostCVCell", for: indexPath) as! PhotoPostCVCell
if let takenImage = cameraPhotoUIImage
{
cell.cellImage.image = takenImage
}
if assets.count > 0
{
let asset = assets[indexPath.row]
// var imageRequestOptions: PHImageRequestOptions
// {
// let options = PHImageRequestOptions()
// //options.version = .current
// //options.resizeMode = .exact
// //options.deliveryMode = .fastFormat
// options.isSynchronous = true
// return options
// }
let targetSize = CGSize(width: asset.pixelWidth, height: asset.pixelHeight)
imageManager.requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFill, options: nil)
{ (image, info) in
if image != nil
{
let imageQualityState = info![PHImageResultIsDegradedKey] as! Bool
if imageQualityState
{
print("LOW QUALITY")
print("Image Quality State is:", imageQualityState)
cell.cellImage.image = image
print(image!.size)
}
else
{
print(image!.size)
cell.cellImage.image = image
self.assetsTurnedIntoImages.append(image!)
}
}
}
}
return cell
}
Run Code Online (Sandbox Code Playgroud)
小智 7
您可以通过包含以下条件来丢弃那些低分辨率重复项:
imageManager.requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFill, options: nil) { (image, info) in
let isDegraded = (info?[PHImageResultIsDegradedKey] as? Bool) ?? false
if isDegraded {
return
}
Run Code Online (Sandbox Code Playgroud)
requestImage:forAsset恐怕对于被叫两次你无能为力。但是,您可以更改将图像放入数组中的方式以避免重复。我可以建议:
self.assetsTurnedIntoImages[indexPath.row] = image
Run Code Online (Sandbox Code Playgroud)
这将导致第二次传递完成的图像来替换第一次调用的图像,从而避免重复。
您需要提前为数组预初始化足够的空间,这样就indexPath.row不会尝试越界访问数组。添加ViewDidLoad一些内容以达到以下效果:
self.assetsTurnedIntoImages = [UIImage](repeating: UIImage(), count: assets.count)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1753 次 |
| 最近记录: |