J'ai un menu coulissant que j'ai implémenté en tant que UICollectionViewController. J'ai également créé des cellules personnalisées pour la vue Collection. La navigation et tout fonctionne comme prévu. Ce qui me pose problème, c'est de changer l'apparence des cellules lorsque je clique sur une cellule réelle.
J'ai essayé plusieurs approches basées sur des solutions ( 1 ) ( 2 ) que j'ai vues ici sur pile mais rien à ma satisfaction.
Solution 1: implémente les méthodes de délégué UICollectionViewController:
class SlideOutMenuViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout{
//Setup code and other delegate methods….
override func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! SlideOutMenuCells
cell.backgroundColor = .white
}
override func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath) {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! SlideOutMenuCells
cell.backgroundColor = UIColor.mainGreen()
}
}
Quand j'ai essayé cette solution, rien ne se passe. La couleur de fond des cellules ne change pas de couleur.
Solution 2: cette solution donne de meilleurs résultats, sauf que la cellule change de couleur lorsque je la tiens. J'aimerais que la couleur d'arrière-plan des cellules clignote ou soit surlignée rapidement sur un tapotez et pas vraiment si l'utilisateur maintient la cellule enfoncée.
class SlideOutMenuCells: UICollectionViewCell {
//Setup code...
override var isHighlighted: Bool {
didSet {
if self.isHighlighted {
backgroundColor = UIColor.darkGreen()
} else {
backgroundColor = UIColor.mainGreen()
}
}
}
}
Aucune des deux solutions ne fonctionne vraiment comme prévu. J'ai lu plusieurs billets ici qui tentent de résoudre ce problème, mais je n'en ai trouvé aucun avec une solution qui fonctionne vraiment. Je voudrais que la cellule clignote en surbrillance avec un robinet, et pas seulement lorsqu'un utilisateur clique et maintient sur une cellule ...
Voici un code de travail pour mettre en surbrillanceUICollectionViewCell
on tap (Swift 4)
Vous n'avez rien à faire dans votre classe UICollectionViewCell
.
class StoreListViewController: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource {
var previousSelected : IndexPath?
var currentSelected : Int?
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 20
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "StoreCollViewCell", for: indexPath) as! StoreCollViewCell
cell.lblofferscount.text = "Cell \(indexPath.row)"
// To set the selected cell background color here
if currentSelected != nil && currentSelected == indexPath.row
{
cell.backgroundColor = UIColor.green
}
else
{
cell.backgroundColor = UIColor.yellow
}
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// For remove previously selection
if previousSelected != nil{
if let cell = collectionView.cellForItem(at: previousSelected!){
cell.backgroundColor = UIColor.yellow
}
}
currentSelected = indexPath.row
previousSelected = indexPath
// For reload the selected cell
self.collVwStores.reloadItems(at: [indexPath])
}
}
Sortie
Vous pouvez essayer d'utiliser UILongPressGestureRecognizer
pour indiquer la sélection:
override func awakeFromNib() {
super.awakeFromNib()
let tapGesture = UILongPressGestureRecognizer(target: self, action: #selector(didTap(recognizer:)))
tapGesture.minimumPressDuration = 0
tapGesture.cancelsTouchesInView = false
addGestureRecognizer(tapGesture)
}
@objc func didTap(recognizer: UILongPressGestureRecognizer) {
if recognizer.state == .began {
backgroundColor = .red
}
if recognizer.state == .ended {
backgroundColor = .green
}
}
ou vous pouvez faire extension
pour UICollectionViewCell
extension UICollectionViewCell {
func makeSelectionIndicatable() {
let tapGesture = UILongPressGestureRecognizer(target: self, action: #selector(didTap(recognizer:)))
tapGesture.minimumPressDuration = 0
tapGesture.cancelsTouchesInView = false
addGestureRecognizer(tapGesture)
}
@objc private func didTap(recognizer: UILongPressGestureRecognizer) {
if recognizer.state == .began {
backgroundColor = .red
}
if recognizer.state == .ended {
backgroundColor = .green
}
}
}
et après cela, pour toute cellule à la méthode awakeFromNib()
, il vous suffit d’ajouter makeSelectionIndicatable()
Vous pouvez le faire en modifiant la couleur si la vue du contenu dans la cellule ressemble à ceci:
class SlideOutMenuCells: UICollectionViewCell {
override var isSelected: Bool {
didSet {
self.contentView.backgroundColor = isSelected ? OLTheme.Colors.Selected_Voucher_Color : UIColor.clear
}
}
}