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
}
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
}
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
}
}
}
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.
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.
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)
}
}
}
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
}