¿Cómo puedo resaltar las celdas seleccionadas de UICollectionView? (Rápido)

Tengo una UICollectionView, y el usuario puede seleccionar varias celdas. Es un poco difícil hacer un seguimiento de qué celdas se han seleccionado, así que necesito una manera de resaltar / crear un borde cuando se toca la celda.

Código:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell: CardsCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! CardsCollectionViewCell parseObjects[indexPath.row].getDataInBackgroundWithBlock{ (imageData: NSData?, error: NSError?) -> Void in if error == nil { let image = UIImage(data: imageData!) cell.cardsImg.image = image } } //cell.cardLabel.text = imageNames[indexPath.row] return cell } func collectionView(collectionView: UICollectionView, shouldSelectItemAtIndexPath indexPath: NSIndexPath) -> Bool { addToList.append(objectsArray[indexPath.row]) return true } 

puede usar el cambio de borde en el evento de sobrescritura didSelectItemAtIndexPath como el código siguiente y asignar nuevas configuraciones a la celda.

Swift 3.x:

 override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { addToList.append(objectsArray[indexPath.row]) let cell = collectionView.cellForItem(at: indexPath) cell?.layer.borderWidth = 2.0 cell?.layer.borderColor = UIColor.gray.cgColor } 

Aquí está mi solución, y estoy seguro de que funciona. Cómo utilizar, simplemente henetworkinge BaseCollectionViewCell , si no necesita efecto resaltado, simplemente busque un método llamado ' shouldHighlightItemAtIndexPath ' en UICollectionViewDelegate y devuelva false.

 private let highlightedColor = UIColor(rgb: 0xD8D8D8) // same with UITableViewCell's selected backgroundColor class BaseCollectionViewCell: UICollectionViewCell { var shouldTintBackgroundWhenSelected = true // You can change default value var specialHighlightedArea: UIView? override var isHighlighted: Bool { // make lightgray background show immediately(使灰背景立即出现) willSet { onSelected(newValue) } } override var isSelected: Bool { // keep lightGray background until unselected (保留灰背景) willSet { onSelected(newValue) } } func onSelected(_ newValue: Bool) { guard selectedBackgroundView == nil else { return } if shouldTintBackgroundWhenSelected { contentView.backgroundColor = newValue ? cellHighlightedColor : UIColor.clear } if let sa = specialHighlightedArea { sa.backgroundColor = newValue ? UIColor.black.withAlphaComponent(0.4) : UIColor.clear } } } extension UIColor { convenience init(rgb: Int, alpha: CGFloat = 1.0) { self.init(networking: CGFloat((rgb & 0xFF0000) >> 16) / 255.0, green: CGFloat((rgb & 0xFF00) >> 8) / 255.0, blue: CGFloat(rgb & 0xFF) / 255.0, alpha: alpha) } } 

Utilizar

 collectionView.reloadItemsAtIndexPaths([indexPath]) 

para recargar la celda actual o

 collectionView.reloadData() 

para volver a cargar todas las celdas en shouldSelectItemAtIndexPath

Luego, en cellForItemAtIndexPath establezca el borde o el color de background si la celda está marcada como marcada (es posible que necesite una nueva matriz para las celdas comprobadas, preferiblemente con IndexPaths.

Intente hacer que los bordes sean lo suficientemente gruesos para cubrir toda la celda.

Código:

 override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { addToList.append(objectsArray[indexPath.row]) let cell = collectionView.cellForItem(at: indexPath) cell?.layer.borderWidth = 200.0 cell?.layer.borderColor = UIColor.init(networking: 0/255, green: 0/255, blue: 0/255, alpha: 0.4).cgColor }