Modifier l'arrière-plan de UICollectionView Cellule sur le Robinet
J'ai un UICollectionView que j'ai créé par programmation. Je voudrais que l'affichage de la collection à se comporter de la façon suivante:
1. User touches cell
2. Cell background color changes
3. User releases touch
4. Cell background color changes
Ce doit être un rapide changement de couleur qui se passe juste avant le sélecteur liées à la tap action est exécutée dans lequel le viewcontroller contenant de l'affichage de la collection est sortie hors de la pile.
J'ai été à la recherche à cette question: UICollectionView cellule de modifier l'arrière-plan tap
dans lequel il y a le résumé suivant des méthodes à utiliser pour ce faire:
//Methods for notification of selection/deselection and highlight/unhighlight events.
//The sequence of calls leading to selection from a user touch is:
//
//(when the touch begins)
//1. -collectionView:shouldHighlightItemAtIndexPath:
//2. -collectionView:didHighlightItemAtIndexPath:
//
//(when the touch lifts)
//3. -collectionView:shouldSelectItemAtIndexPath: or - collectionView:shouldDeselectItemAtIndexPath:
//4. -collectionView:didSelectItemAtIndexPath: or -collectionView:didDeselectItemAtIndexPath:
//5. -collectionView:didUnhighlightItemAtIndexPath:
Je suis en supposant que je n'ai besoin que pour mettre en œuvre l'une des méthodes ci-dessus de " toucher quand commence et quand touch se termine.' Mais peu importe ce que je fais, il semble qu'un changement de couleur de fond et reste ensuite changé. Voici un exemple de quelque chose que j'ai essayé qui ne fonctionne pas:
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
//pop vc
}
- (void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell* cell = [collectionView cellForItemAtIndexPath:indexPath];
cell.contentView.backgroundColor = [UIColor redColor];
}
- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
cell.contentView.backgroundColor = [UIColor greenColor];
}
Cette résultats dans la cellule de la couleur d'arrière-plan d'être modifiées uniquement pour le rouge. J'ai également regardé cette question: UICollectionView Sélectionner et Désélectionner des question et essayé de mise en œuvre de [UICollectionView selectItemAtIndexPath:animation:scrollPosition:] et de l'appeler à l'intérieur de didSelectItemAtIndexPath, mais cela ne fonctionne pas non plus. La collecte de vue de source de données et délégué sont fixés.
- Vérifier ma réponse ici: <stackoverflow.com/a/44112257/5416775> Ça marche...!
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous êtes à la modification de la couleur sur mettre en évidence et de le changer en arrière sur désélectionner plutôt que sur unhighlight
Il vous suffit de modifier ce:
à ceci:
Aussi, si vous ne voulez pas attendre un peu avant de se mettre en évidence votre cas, vous devez définir la
delaysContentTouches
propriété de l'affichage de la collection deNO
Edit: également veiller à ce que vous appelez
à l'intérieur de l'-didSelectItemAtIndexPath méthode
didUnhighlightItemAtIndexPath
ne semble pas fonctionner pour moi. Quelles sont les raisons pour lesquelles il peut-être pas de tir?Swift 3 version
Ajouter les deux méthodes suivantes pour votre point de vue de la classe contrôleur:
Voir ici pour les aider dans la mise en place d'une collection de base en vue de Swift.
Edit: Réponse à Swift 3
Voici ma solution. Et je suis sûr que ça fonctionne vraiment.
- Je fournir trois méthodes pour mettre en surbrillance une cellule (selectedBackgroundView, la teinte
cell.contentView
et la teinte d'une zone spéciale).Comment utiliser:
1. juste hériter
BaseCollectionViewCell
et de ne rien faire;2. hériter et de définir
specialHighlightedArea = UIView()
, etcontentView.addSubView(specialHighlightedArea)
, puis mise en page ou d'ajouter la contrainte d'utiliser la Mise en page Automatique;3. si vous n'avez pas besoin de mettre en évidence l'effet, il suffit d'écrire une méthode nommée "shouldHighlightItemAtIndexPath" définies par
UICollectionViewDelegate
et de le rendre renvoie la valeur false, ou un ensemblecell.shouldTintBackgroundWhenSelected = false
et définirspecialHighlightedArea = nil
et de le retirer de superView.specialHighlightedArea
effectivement être faible?weak
.Simple logique binaire solution. Fonctionne avec Swift 3 et 4: