37 votes

ios7 UITableViewCell selectionStyle ne revient pas au bleu

Xcode 5.0, iOS 7 et mise à jour d'une application existante. UITableView La ligne sélectionnée est maintenant grise, et non plus bleue.

D'après ce que j'ai lu, ils ont changé le défaut selectionStyle à gris. Mais le "bleu" est toujours une option dans l'IB et l'UE. UITableViewCellSelectionStyleBlue existe toujours. En regardant le nouveau HIG, il ne semble pas qu'ils aient supprimé le bleu et l'application "Paramètres" utilise toujours la sélection de cellules bleues.

J'ai essayé de définir la valeur dans l'IB et dans le code, mais sans succès. Avez-vous une idée de ce que je dois faire pour récupérer le style de sélection bleu ?

58voto

null Points 11407

Il n'y a qu'un seul selectionStyle dans iOS7, pour le changer vous devez le faire manuellement comme ci-dessous :

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    ....
    UIView *bgColorView = [[UIView alloc] init];
    bgColorView.backgroundColor = [UIColor colorWithRed:(76.0/255.0) green:(161.0/255.0) blue:(255.0/255.0) alpha:1.0]; // perfect color suggested by @mohamadHafez
    bgColorView.layer.masksToBounds = YES;
    cell.selectedBackgroundView = bgColorView;
    ....
    return cell;
}

13voto

Walter Points 4484

Je sais qu'on a déjà répondu à cette question, mais la dernière chose que je voulais faire, c'était de toucher tous mes cellForRowAtIndexPath méthodes. J'ai donc utilisé un proxy d'apparence dans mon délégué d'application. J'ai repris le code de @null ci-dessus pour définir l'affichage de l'arrière-plan sélectionné et, dans l'attribut applicationDidFinishLaunching:withOptions: j'ai placé ce code.

UIView *bgColorView = [[UIView alloc] init];
//the rest of null's code to make the view
[[UITableViewCell appearance] setSelectedBackgroundView:bgColorView];

Ensuite, pour rendre le texte blanc très clair :

[[UILabel appearanceWhenContainedIn:[UITableViewCell class], nil] setHighlightedTextColor:[UIColor whiteColor]];

Cela a entraîné un changement global dans mon application. L'apparence proxy a été introduite dans iOS5 et Mattt a un un excellent article sur la façon de l'utiliser sur son blog NSHipster .

7voto

Max Tymchii Points 291

Ça pourrait probablement vous aider. J'ai ma cellule personnalisée et pour qu'elle soit sélectionnée avec la couleur désirée, j'ai écrasé setHighlighted et setSelected maintenant ça ressemble à ça

#define IOS_7 (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1 ? YES : NO)

    - (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];
    [self changeSelectionColorForSelectedORHiglightedState:selected];
    // Configure the view for the selected state
}

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
    [super setHighlighted:highlighted animated:animated];
    [self changeSelectionColorForSelectedORHiglightedState:highlighted];
}

- (void)changeSelectionColorForSelectedORHiglightedState:(BOOL)state
{
    if (IOS_7) {
        if (state) {
            self.contentView.backgroundColor = [UIColor blueColor];
        }
    }
}

0voto

Thunk Points 3132

Je sais que je suis vraiment en retard pour la fête, mais je vais également proposer mon contournement de IOS10. Ne touchez à aucun de vos autres codes, mais ajoutez-les :

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.backgroundColor = [UIColor blueColor];
    cell.textLabel.textColor = [UIColor whiteColor];

     ... whatever else you do ...
}

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(nonnull NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.backgroundColor = [UIColor whiteColor];
    cell.textLabel.textColor = [UIColor blackColor];
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X