在UICollectionView中从数组添加和删除UIImage

时间:2018-02-15 18:06:30

标签: ios swift uicollectionview uiimage

我的应用将图片从iPhone图库,Facebook和Instagram加载到UICollectionView。一切正常,但我遇到了一个小问题而且我被卡住了..用户可以选择一些图像(来自图库,Fb或IG)并将其加载到另一个ViewController,使用Facebook和Instagram事情很简单,因为当用户选择图像时,我将URL加载到数组中,当他取消选择时,只需从数组中删除此URL。问题出现在iPhone图库中。他可以选择图像但是他无法启封(我只是无法从阵列中删除取消选择的图像)。

这是ViewController的代码,它负责从库中选择和“取消选择”图像。

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    _selectedCells.add(indexPath)
    collectionView.reloadItems(at: [indexPath])

    CounterManager.addPhotos()

    // These lines should add selected images to the array
    let asset = fetchResult.object(at: indexPath.row)
    let image = getUIImage(asset: asset)

    tempUIImageArray.append(image!)
    CounterManager.updateText(label: numberOfPickslabel)
    GalleryManager.selectedGalleryImages.append(image!)


    if CounterManager.flag && CounterManager.counter >= 20 {
        present(CounterManager.alert(), animated: true, completion: nil)

    } else if CounterManager.flag == false && CounterManager.counter >= 40 {

        present(CounterManager.alert(), animated: true, completion: nil)
    }

}

func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {

    collectionView.allowsSelection = true
    _selectedCells.remove(indexPath)
    collectionView.reloadItems(at: [indexPath])
    collectionView.deselectItem(at: indexPath, animated: true)

    CounterManager.subPhotos()
    CounterManager.updateText(label: numberOfPickslabel)

    //These lines should remove images from the Array
    let asset = fetchResult.object(at: indexPath.row)
    let image = getUIImage(asset: asset)
    GalleryManager.selectedGalleryImages = GalleryManager.selectedGalleryImages.filter({$0 != image})
}

GalleryManager.selectedGalleryImages是所有图像的全局数组(来自gallery,Fb和IG)。

getUIImage是将PHAsset转换为UIImage

的方法

似乎所选和取消选择的图像会不断更改某些数据。下面是我正在选择和取消选择相同图像的图片。我不明白为什么会这样......

enter image description here 我将非常感谢各种帮助。 谢谢M。

3 个答案:

答案 0 :(得分:0)

您的问题是将图像与另一个图像进行比较,以过滤并删除此处取消选择的图像

 GalleryManager.selectedGalleryImages = GalleryManager.selectedGalleryImages.filter({$0 != image})

这不是有效的,因为图像比较远不是这样,所以你应该将每个图像与id或index相关联,以根据那个选择或取消选择

答案 1 :(得分:0)

您从图库中获取实际UIImage并将其存储在数组中,而不是图像位置的唯一文本引用。我怀疑这与GalleryManager加载图片的方式有关(因为您只是使用!=比较原始图像数据,这不起作用)。但是没有看到代码,我无法确定。

我建议使用ALAssetsLibrary来获取图片的参考网址,并将其存储在您的数组中 - 这样您就可以保证图片参考是唯一的,并且您可以轻松地将其从您的图片中删除阵列。

一些旁注:

  1. 在数组中存储二进制数据会像疯了一样吃掉内存。它效率不高,而且你会遇到问题(特别是在旧设备上)。

  2. 只要asset为nil,此代码就可能会中断:

    let image = getUIImage(asset: asset)
    tempUIImageArray.append(image!)
    

    这是guardif x let

    的理想候选人
    guard let image = getUIImage(asset: asset) else { return }
    tempUIImageArray.append(image)
    

答案 2 :(得分:0)

问题是你比较了两个不同的UIImage实例,即使它们是从相同的数据创建的,但它们也不会被评估为相同。

不是将选定的图像保存在单独的数组(GalleryManager.selectedGalleryImages)中,而是保留原始图像数组,并检测选择的图像,创建一个选定图像阵列。原始图像阵列中的索引(例如,GalleryManager.selectedGalleryImagesIndixes)。这样,您可以通过索引访问原始数组来访问所选图像,并且您希望在比较两个UIImage时遇到问题,因为您将使用Int s。

<强>更新

基于UIImage documentation

  

比较图片

     

isEqual(_:)方法是确定两个图像是否包含相同图像数据的唯一可靠方法。您创建的图像对象可能彼此不同,即使使用相同的缓存图像数据初始化它们也是如此。确定其相等性的唯一方法是使用isEqual(_:)方法,该方法比较实际图像数据。清单1说明了比较图像的正确和错误方法。

     

清单1

     

比较两张图片

let image1 = UIImage(named: "MyImage")
let image2 = UIImage(named: "MyImage") 
if image1 != nil && image1!.isEqual(image2) {
    // Correct. This technique compares the image data correctly.
} 
if image1 == image2 {
    // Incorrect! Direct object comparisons may not work.
}

因此,使用==!=.isEqual(_:)交换比较时,您的问题也可以解决。

变化:

GalleryManager.selectedGalleryImages = GalleryManager.selectedGalleryImages.filter({$0 != image})

要:

GalleryManager.selectedGalleryImages = GalleryManager.selectedGalleryImages.filter({ !($0.isEqual(image)) })