J'implémente une vue de table de sélection de couleurs où l'utilisateur peut sélectionner parmi, par exemple, 10 couleurs (dépend du produit). L'utilisateur peut également sélectionner d'autres options (comme la capacité du disque dur, ...).
Toutes les options de couleur se trouvent dans leur propre section d'affichage de table.
Je veux afficher un petit carré à gauche du textLabel montrant la couleur réelle.
En ce moment, j'ajoute un simple UIView carré, donnez-lui la bonne couleur d'arrière-plan, comme ceci:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:RMProductAttributesCellID];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:RMProductAttributesCellID] autorelease];
cell.indentationWidth = 44 - 8;
UIView *colorThumb = [[[UIView alloc] initWithFrame:CGRectMake(8, 8, 28, 28)] autorelease];
colorThumb.tag = RMProductAttributesCellColorThumbTag;
colorThumb.hidden = YES;
[cell.contentView addSubview:colorThumb];
}
RMProductAttribute *attr = (RMProductAttribute *)[_product.attributes objectAtIndex:indexPath.section];
RMProductAttributeValue *value = (RMProductAttributeValue *)[attr.values objectAtIndex:indexPath.row];
cell.textLabel.text = value.name;
cell.textLabel.backgroundColor = [UIColor clearColor];
UIView *colorThumb = [cell viewWithTag:RMProductAttributesCellColorThumbTag];
colorThumb.hidden = !attr.isColor;
cell.indentationLevel = (attr.isColor ? 1 : 0);
if (attr.isColor) {
colorThumb.layer.cornerRadius = 6.0;
colorThumb.backgroundColor = value.color;
}
[self updateCell:cell atIndexPath:indexPath];
return cell;
}
Cela affiche bien sans problèmes.
Mon seul problème est que lorsque je sélectionne une ligne "couleur", lors de l'animation de sélection de fondu au bleu, mon UIView personnalisé (colorThumb) est masqué. Il redevient visible juste après la fin de l'animation de sélection / désélection, mais cela produit un artefact laid.
Que dois-je faire pour corriger cela? Est-ce que je n'insère pas la sous-vue au bon endroit?
(Il n'y a rien de spécial dans le didSelectRowAtIndexPath, je change simplement l'accessoire de la cellule en une case à cocher ou rien et désélectionne l'indexPath actuel).
la source
Réponses:
UITableViewCell
change la couleur de fond de tous les sous vues lorsque la cellule est sélectionnée ou en surbrillance, vous pouvez résoudre ce problème en remplaçant la cellule de TableviewsetSelected:animated
etsetHighlighted:animated
et la réinitialisation de la couleur de fond de la vue.Dans l'objectif C:
Dans Swift 3.1:
la source
if (highlighted)
etif (selected)
? Je pense que cela fonctionnera si nous n'avons pas ces conditions.C'est parce que la cellule de vue de tableau change automatiquement la couleur d'arrière-plan de toutes les vues dans la vue de contenu pour l'état en surbrillance. Vous pouvez envisager de sous-classer
UIView
pour dessiner votre couleur ou utiliserUIImageView
avec une image étirée personnalisée 1x1 px.la source
setHighlighted:animated:
setSelected:animated:
J'ai trouvé une solution assez élégante au lieu de jouer avec les méthodes de sélection / mise en évidence de tableViewCell. Vous pouvez créer une sous-classe d'UIView qui ignore la définition de sa couleur d'arrière-plan sur une couleur claire.
Swift 3/4:
Swift 2:
Version Obj-C:
la source
Une autre façon de gérer le problème consiste à remplir la vue avec un dégradé graphique de base, comme:
la source
Pour Swift 2.2, cela fonctionne
et la raison est expliquée par @ Andriy
la source
Inspiré par Yatheesha BL de réponse J'ai créé une catégorie / extension de UITableViewCell qui vous permet d'activer et de désactiver cette transparence « fonctionnalité ».
Rapide
Objectif c
KeepBackgroundCell est compatible avec les CocoaPods. Vous pouvez le trouver sur GitHub
la source
Vous pouvez
cell.selectionStyle = UITableViewCellSelectionStyleNone;
, puis définir le backgroundColor à- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath
la source
Inspiré de la réponse de Yatheesha BL .
Si vous appelez super.setSelected (sélectionné, animé: animé), il effacera toutes les couleurs d'arrière-plan que vous avez définies . Donc, nous n'appellerons pas super méthode.
Dans Swift:
la source
Dans certains cas, voici les Septs pour éviter d'obtenir la couleur grise pour tous les éléments de la cellule (au cas où vous utilisez une cellule de vue de tableau personnalisée):
Définissez selectionStyle sur .none 👉
selectionStyle = .none
Remplacez cette méthode.
Appelez le super, pour profiter de la super configuration.
Faites ce que vous voulez pour mettre en évidence la logique.
la source
UITableViewCell modifie le backgroundColor de toutes les sous-vues lors de la sélection pour une raison quelconque.
Cela pourrait aider:
DVColorLockView
Utilisez quelque chose comme ça pour empêcher UITableView de changer la couleur de votre vue pendant la sélection.
la source
Dessinez la vue au lieu de définir la couleur d'arrière-plan
la source
Solution LA PLUS SIMPLE sans bugs avec animation (comme dans la réponse la mieux notée) et sans sous-classification et dessin - définissez la couleur de la bordure du calque au lieu de backgroundColor et définissez une très grande largeur de bordure.
la source
Essayez le code suivant:
la source
N'oubliez pas de remplacer
setSelected
ainsi quesetHighlighted
la source
Ceci est similaire à la réponse de Pavel Gurov, mais plus flexible en ce sens qu'elle permet à n'importe quelle couleur d'être permanente.
la source
Je voulais conserver le comportement de sélection par défaut, sauf pour une sous-vue de cellule que je voulais ignorer le changement de couleur d'arrière-plan automatique. Mais j'avais aussi besoin de pouvoir changer la couleur d'arrière-plan à d'autres moments.
La solution que j'ai trouvée était de sous-classe
UIView
afin qu'elle ignore le réglage de la couleur d'arrière-plan normalement et ajoute une fonction distincte pour contourner la protection.Swift 4
la source
voici ma solution, utilisez contentView pour afficher selectionColor, ça marche parfaitement
la source
Placez ce code dans votre sous-classe de
UITableViewCell
Syntaxe de Swift 3
la source
Ajout d'une autre solution si vous utilisez des storyboards. Créez une sous-classe de
UIView
qui ne permet pasbackgroundColor
de définir le après sa définition initiale.la source
Si la solution d'arrière-plan mentionnée ci-dessus ne
datasource
résout pas votre problème, votre problème peut résider dans votre for your tableView.Pour moi, je
BoxDataSource
créais une instance d'un objet DataSource (appelé ) pour gérer les méthodes délégué et dataSource tableView, comme suit:Cela provoquait la désallocation de la source de données chaque fois que la cellule était exploitée, et donc tout le contenu disparaissait. La raison en est la nature de la désallocation / récupération de la mémoire ARC.
Pour résoudre ce problème, j'ai dû aller dans la cellule personnalisée, ajouter une variable de source de données:
Ensuite, vous devez définir la source de données sur la source de données de la cellule que
var
vous venez de créer dans cellForRow, afin qu'elle ne soit pas désallouée avec ARC.J'espère que cela pourra aider.
la source