2008-11-04 18 views
35

Je développe une application iPhone, dans ma vue de table Je voulais des couleurs personnalisées pour le style de sélection de cellule, j'ai lu la référence de classe UITableViewCell mais il n'y a que trois constantes définies pour le style Sélection (Bleu, Gris, Aucun). J'ai vu une application qui utilisait une couleur différente de celles définies dans la référence. Comment utiliser une couleur différente de celles définies dans la référence?Comment définir la propriété UITableViewCellSelectionStyle sur une couleur personnalisée?

Merci d'avance. Remplacer didSelectRowAtIndexPath: et dessine un UIView d'une couleur de votre choix et l'insère derrière le UILabel à l'intérieur de la cellule

+0

Je recommande fortement l'approche de Matt Gallagher par rapport à celle que vous avez acceptée! S'il vous plaît envisager de le regarder si vous ne l'avez pas déjà fait. –

+0

La réponse dans ce post sont tellement foiré. Tout le monde s'il vous plaît ignorer les plus élevés et aller voter les bonnes réponses, qui sont en bas. – bentford

Répondre

64

La meilleure façon de définir la sélection est de définir le selectedBackgroundView sur la cellule lorsque vous le construisez.

à-dire

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
     cell.selectedBackgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground.png"]] autorelease]; 
    } 

    // configure the cell 
} 

L'image utilisée doit avoir un gradient bien (comme la sélection par défaut). Si vous voulez juste une couleur plate, vous pouvez utiliser un UIView au lieu d'un UIImageView et définir le backgroundColor à la couleur que vous voulez.

Ce fond est ensuite appliqué automatiquement lorsque la ligne est sélectionnée.

+5

Qu'en est-il des vues de table de style groupées? Je viens d'utiliser une image rectangle et il a montré à travers les courbes arrondies des cellules tableview. +1 pour une bonne réponse. – JoePasq

+3

Pour les cellules de vue de table groupées, vous avez besoin de 4 arrière-plans - haut, bas, milieu et haut et bas et vous devez les appliquer en fonction de l'emplacement de la cellule dans le groupe. –

+0

Ne pouvez-vous pas faire cela sans utiliser d'images? –

2

Je le ferais quelque chose comme ceci:

UIView* selectedView; //inside your header 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 

    UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath]; 
    selectedView = [[UIView alloc] initWithFrame:[cell frame]]; 
    selectedView.backgroundColor = [UIColor greenColor]; //whatever 

    [cell insertSubview:selectedView atIndex:0]; //tweak this as necessary 
    [selectedView release]; //clean up 

} 

Vous pouvez choisir d'animer ce point de vue quand il se décochée et répondra à vos attentes.

+8

Cette approche évite la fonction selectedBackgroundView intégrée d'Apple sur chaque UITableViewCell. Si vous utilisez la vue arrière-plan sélectionnée, votre sélection animera l'entrée et la sortie et sera également désélectionnée lorsque vous y êtes invité. –

+1

Il serait préférable de surcharger 'setSelected: highlight:' dans la cellule et de faire la logique là-bas si vous allez utiliser cette approche pour qu'elle fonctionne dans tous les contrôleurs de vue. Comme l'a dit Matt, l'utilisation de 'selectedBackgroundView' est une bien meilleure approche. –

+0

+1 Bonne réponse, quoique un peu hacky. Pas une mauvaise chose! – bentford

24

La définition de selectedBackgroundView semble n'avoir aucun effet lorsque le cell.selectionStyle est défini sur UITableViewCellSelectionStyleNone. Lorsque je ne définis pas le style, j'utilise simplement le gris par défaut. L'utilisation de la première suggestion qui insère le UIView personnalisé dans la cellule manipule la cellule mais ne s'affiche pas lorsque la cellule est touchée, seulement après l'action sélectionnée qui est trop tardive parce que je pousse à une nouvelle vue. Comment puis-je afficher la vue sélectionnée dans la cellule avant le début de l'opération sélectionnée?

+1

Cela nécessite plus de votes upvotes. – freespace

+4

Ceci est correct. Je dois définir selectionStyle sur Flou ou Gris. Aucun ne fera que ça ne marche pas. Quoi qu'il en soit, vous pouvez le faire en remplaçant la méthode '-setHighlited: animated:' de la classe 'UITableViewCell'. – Eonil

+1

-1 Cela devrait être un commentaire. – bentford

7

J'ai essayé certains de ce qui précède, et Je préfère réellement créer ma propre sous-classe de UITableViewCell, puis remplacer les méthodes touchesBegan/touchesCancelled/touchesEnded. Pour ce faire, ignorez toutes les propriétés selectedBackgroundView etlinedColor sur la cellule, et définissez simplement ces couleurs manuellement à chaque fois qu'une des méthodes ci-dessus est appelée. Par exemple, si vous souhaitez définir la cellule d'avoir un fond vert avec le texte rouge, essayez ceci (dans votre sous-classe de cellules personnalisée):

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    //Set backgorund 
    self.backgroundColor = [UIColor themeBlue]; 

    //Set text 
    self.textLabel.textColor = [UIColor themeWhite]; 

    //Call super 
    [super touchesBegan:touches withEvent:event]; 
} 

Notez que pour que cela fonctionne, vous devez définir:

self.selectionStyle = UITableViewCellSelectionStyleNone; 

Sinon, vous obtiendrez d'abord le style de sélection actuel.

EDIT: Je suggère d'utiliser la méthode touchesCancelled pour revenir aux couleurs de cellule d'origine, mais ignorez simplement la méthode touchesEnded.

+0

+1 Bonne réponse! – bentford

12

Si vous avez sous-classé un UITableViewCell, vous pouvez alors personnaliser les différents éléments de la cellule en remplaçant les éléments suivants:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
    if(highlighted) { 
     self.backgroundColor = [UIColor redColor]; 
    } else { 
     self.backgroundColor = [UIColor clearColor]; 
    } 

    [super setHighlighted:highlighted animated:animated]; 
} 

EDIT pour iOS 7: comme Sasho dit, vous avez également besoin

cell.selectionStyle = UITableViewCellSelectionStyleNone 
+0

+1 Bonne réponse, cela a résolu mon problème. Merci! – bentford

+0

Dans iOS 7, la solution ci-dessus fonctionnait en combinaison avec "cell.selectionStyle = UITableViewCellSelectionStyleNone". – Sasho

1

Sublcass UITableViewCell et remplacement setHighlighted:animated:

Vous pouvez définir une couleur de couleur de sélection personnalisée en définissant backgroundColor (voir la réponse de WIllster):

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
    if(highlighted) { 
     self.backgroundColor = [UIColor redColor]; 
    } else { 
     self.backgroundColor = [UIColor clearColor]; 
    } 

    [super setHighlighted:highlighted animated:animated]; 
} 

Vous pouvez définir une image de fond personnalisée en définissant la propriété backgroundView:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
    if(highlighted == YES) 
     self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"seasonal_list_event_bar_default.png"]]; 
    else 
     self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"seasonal_list_event_bar_active.png"]]; 


    [super setHighlighted:highlighted animated:animated]; 
} 
0
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
// Set Highlighted Color 
if (highlighted) { 
self.backgroundColor = [UIColor colorWithRed:234.0f/255 green:202.0f/255 blue:255.0f/255 alpha:1.0f]; 
    } else { 
     self.backgroundColor = [UIColor clearColor]; 
    } 
} 
+0

UITableViewCell a une méthode pour définir la couleur de l'état en surbrillance Ici, le code spinnet // s'anime entre l'état normal et l'état en surbrillance – PK86

0
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath { 
    return YES; 
} 

- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Add your Colour. 
    SocialTableViewCell *cell = (SocialTableViewCell *)[tableView cellForRowAtIndexPath:indexPath]; 
    [self setCellColor:Ripple_Colour ForCell:cell]; //highlight colour 
} 

- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Reset Colour. 
    SocialTableViewCell *cell = (SocialTableViewCell *)[tableView cellForRowAtIndexPath:indexPath]; 
    [self setCellColor:Ripple_Colour ForCell:cell]; //normal color 

} 

- (void)setCellColor:(UIColor *)color ForCell:(UITableViewCell *)cell { 
    cell.contentView.backgroundColor = color; 
    cell.backgroundColor = color; 
} 
0

Pour ajouter une utilisation couleur personnalisée du code ci-dessous . Et pour le rendre l'utilisation transparente alpha: 0.0

cell.selectedBackgroundView = UIView(frame: CGRect.zero) 
cell.selectedBackgroundView?.backgroundColor = UIColor(red:0.27, green:0.71, blue:0.73, alpha:1.0) 

Si vous utilisez la couleur personnalisée et que vous voulez donner arrondi usage look coin:

cell.layer.cornerRadius = 8 

En outre, l'utiliser pour une meilleure animation et se sentent

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    tableView.deselectRow(at: indexPath, animated: true) 
}