在我的应用程序中,我们需要在collectionView中重新排序图像,collectionView的第一个图像应该反映在imageView上,所以这是我的实现
//MARK: Variable declaration
@IBOutlet var imageViewMain: UIImageView!
@IBOutlet var collectionViewImages: UICollectionView!
var listingImages : [UIImage] = [UIImage(named:"demo_advertisement")!, UIImage(named:"camera_black")!, UIImage(named:"twitter-bird-logo")!, UIImage(named:"money-bag")!]
//MARK: DataSource
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
{
let addPhotosCell = collectionView.dequeueReusableCellWithReuseIdentifier("AddPhototsCollectionViewCell", forIndexPath: indexPath) as! AddPhototsCollectionViewCell
addPhotosCell.imageView.image = listingImages[indexPath.item]
// if listingImages.count > 0 {
// imageViewMain.image = listingImages[0]
// }
return addPhotosCell
}
func collectionView(collectionView: UICollectionView, moveItemAtIndexPath sourceIndexPath: NSIndexPath,toIndexPath destinationIndexPath: NSIndexPath) {
// swap values if sorce and destination
let src = listingImages[sourceIndexPath.row]
let dest = listingImages[destinationIndexPath.row]
listingImages[destinationIndexPath.row] = src
listingImages[sourceIndexPath.row] = dest
self.collectionViewImages.performBatchUpdates({
self.collectionViewImages.reloadData()
}, completion: nil)
}
我想要实现的目标:
问题:
如果我这样做
self.collectionViewImages.reloadData()
在moveItemAtIndexPath中重新排序图像时,它显示了像
这样的重复图像我正在调用reloadData(),因为我需要在cellForItemAtIndexPath中将collectionView的第一个元素设置为imageViewMain。
我的尝试:如果我没有调用reloadData并尝试将图像设置为moveItemAtIndexPath中的imageViewMain
imageViewMain.image = listingImages[0]
在下面的行之后,它将无法在imageViewMain上正确反映。(但在这种情况下,图像重新排序完美无需任何重复图像)
let src = listingImages[sourceIndexPath.row]
let dest = listingImages[destinationIndexPath.row]
listingImages[destinationIndexPath.row] = src
listingImages[sourceIndexPath.row] = dest
任何人都可以建议我实施这个的正确方法是什么?
答案 0 :(得分:2)
添加
addPhotosCell.imageView.image = nil
cellForItemAtIndexPath
正好在dequeueReusableCellWithReuseIdentifier
下方的我的意思是它应该是cellForItemAtIndexPath
的第二行。
现在,为什么会这样?答案是集合视图dequeue
单元格和resue
它的内存效率和更好的性能。所以有时你没有得到新的图像然后显示前一个图像因为图像没有被覆盖!!
因此,您必须将单元格的imagview设置为nil
,否则您必须设置一些placeholder image
,如果您没有图像可以显示!
答案 1 :(得分:2)
实际上是我用
写的逻辑moveItemAtIndexPath
错了。而不是
let src = listingImages[sourceIndexPath.row]
let dest = listingImages[destinationIndexPath.row]
listingImages[destinationIndexPath.row] = src
listingImages[sourceIndexPath.row] = dest
应该是
let src = listingImages[sourceIndexPath.row]
listingImages.removeAtIndex(sourceIndexPath.row)
listingImages.insert(src, atIndex: destinationIndexPath.row)
collectionViewImages.reloadData()