web-dev-qa-db-fra.com

Comment mettre en évidence les cellules UICollectionView sélectionnées? (Rapide)

J'ai un UICollectionView et l'utilisateur peut sélectionner plusieurs cellules. Il est un peu difficile de savoir quelles cellules ont été sélectionnées. Il me faut donc un moyen de surligner/créer une bordure lorsque la cellule est engagée.

Code:

func collectionView(collectionView: UICollectionView, shouldSelectItemAtIndexPath indexPath: NSIndexPath) -> Bool {

    addToList.append(objectsArray[indexPath.row])

    return true

}
17
bkwebhero

vous pouvez utiliser le changement de bordure pour un événement didSelectItemAtIndexPath comme le code ci-dessous et affecter de nouveaux paramètres à la cellule.

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
}
41
Özgür Ersil

Voici ma solution et je suis sûr que cela fonctionne. 

Ma solution comprend 3 effets de surbrillance, la variable UICollectionCell, selectedBackgroundView, cell.contentView.backgroundColor ou votre propre specialHighlightedArea.

Comment utiliser? Juste hériter BaseCollectionViewCell. Si nécessaire, configurez les méthodes de délégué de la cellule init ou collectionView.

Si vous n'avez pas besoin d'effet de surbrillance, recherchez simplement une méthode appelée ' shouldHighlightItemAtIndexPath ' dans UICollectionViewDelegate et renvoyez false ou définissez simplement cell.shouldTintBackgroundWhenSelected = false.

extension UIColor {
    convenience init(rgb: Int, alpha: CGFloat = 1.0) {
        self.init(red: CGFloat((rgb & 0xFF0000) >> 16) / 255.0, green: CGFloat((rgb & 0xFF00) >> 8) / 255.0, blue: CGFloat(rgb & 0xFF) / 255.0, alpha: alpha)
    }
}
/// same with UITableViewCell's selected backgroundColor
private let highlightedColor = UIColor(rgb: 0xD8D8D8) 

class BaseCollectionViewCell: UICollectionViewCell {

    var shouldTintBackgroundWhenSelected = true // You can change default value
    var specialHighlightedArea: UIView?

    // make lightgray background show immediately(使灰背景立即出现)
    override var isHighlighted: Bool { 
        willSet {
            onSelected(newValue)
        }
    }
    // keep lightGray background until unselected (保留灰背景)
    override var isSelected: Bool { 
        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
        }
    }
}
11
DawnSong

Vous pouvez créer un collcetionViewCell personnalisé et remplacer:

class MyCell: UICollectionViewCell {

    override var isHighlighted: Bool {
        didSet {
            if self.isHighlighted {
                print("yes")
                // Your customized animation or add a overlay view
            } else {
                print("no")
                // Your customized animation or remove overlay view
            }
        }
    }
}

De cette façon, vous pouvez créer un résultat similaire à celui de l'effet de surbrillance sur UITableViewCell.

Sans sous-classement:

Si vous ne voulez pas créer votre propre collectionViewCell. vous pouvez utiliser la méthode delegate:

func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath)

func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath)

Vous pouvez faire la même chose avec.

4
Strong

Utilisation 

collectionView.reloadItemsAtIndexPaths([indexPath])

recharger la cellule actuelle, ou 

collectionView.reloadData()

recharger toutes les cellules dans shouldSelectItemAtIndexPath

Puis, dans cellForItemAtIndexPath, définissez votre couleur de bordure ou d'arrière-plan si la cellule est marquée comme étant cochée (vous aurez peut-être besoin d'un nouveau tableau pour les cellules cochées avec de préférence indexPaths.

4
Sunkas

Pour une sélection multiple de cellules, vous pouvez le faire comme suit:

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

    if let currentCell = collectionView.cellForItem(at: indexPath) as? QuestionnaireCollectionViewCell {

        // Your selection logic, you can change it according to your requirement
       if currentCell.selectedImage.isHidden == true{
           currentCell.selectedImage.isHidden = false

       }
       else{
          currentCell.selectedImage.isHidden = true
       }
    }

    }

}

Pour une sélection unique, vous pouvez utiliser isSelected dans votre classe collectionviewcell comme suit:

 override var isSelected: Bool{
   didSet{
     if self.isSelected
     {
     //This block will be executed whenever the cell’s   selection state is set to true (i.e For the selected cell)
     }
    else
     {
     //This block will be executed whenever the cell’s selection state is set to false (i.e For the rest of the cells)
     }
   }
}
0
H S Progr

Essayez de rendre les frontières assez épaisses pour couvrir toute la cellule

Code: 

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(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.4).cgColor
}
0
Deepansh Jagga