我的应用将图片从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
似乎所选和取消选择的图像会不断更改某些数据。下面是我正在选择和取消选择相同图像的图片。我不明白为什么会这样......
答案 0 :(得分:0)
您的问题是将图像与另一个图像进行比较,以过滤并删除此处取消选择的图像
GalleryManager.selectedGalleryImages = GalleryManager.selectedGalleryImages.filter({$0 != image})
这不是有效的,因为图像比较远不是这样,所以你应该将每个图像与id或index相关联,以根据那个选择或取消选择
答案 1 :(得分:0)
您从图库中获取实际UIImage
并将其存储在数组中,而不是图像位置的唯一文本引用。我怀疑这与GalleryManager
加载图片的方式有关(因为您只是使用!=
比较原始图像数据,这不起作用)。但是没有看到代码,我无法确定。
我建议使用ALAssetsLibrary
来获取图片的参考网址,并将其存储在您的数组中 - 这样您就可以保证图片参考是唯一的,并且您可以轻松地将其从您的图片中删除阵列。
一些旁注:
在数组中存储二进制数据会像疯了一样吃掉内存。它效率不高,而且你会遇到问题(特别是在旧设备上)。
只要asset
为nil,此代码就可能会中断:
let image = getUIImage(asset: asset)
tempUIImageArray.append(image!)
这是guard
或if 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)) })