54 votes

La ligne de séparation de UITableView disparaît lors de la sélection des cellules dans iOS7

Dans mon tableView, je place une ligne de séparation entre les cellules. J'autorise la sélection de plusieurs cellules. Voici mon code pour définir la couleur de fond de la cellule sélectionnée :

UIView *cellBackgroundColorView = [[UIView alloc] initWithFrame:cell.frame];
[cellBackgroundColorView setBackgroundColor:[UIColor darkGray]];
[cell setSelectedBackgroundView:cellBackgroundColorView];

Le problème est que si deux cellules adjacentes sont sélectionnées, il n'y a pas de ligne séparatrice entre elles dans iOS7, alors qu'il y en a une (comme prévu) dans iOS6.

J'ai même essayé de mettre cellBackgroundColorView de la hauteur du cadre de l'entreprise à celui de l'entreprise cell.frame - 1.0 mais ça ne marche pas non plus.

Des idées ?

38voto

Mark Points 211

Je n'ai pas encore trouvé le fond du problème (à première vue, cela semble être un bug d'iOS 7 ), mais j'ai trouvé une solution de contournement. Dans tableView:didSelectRowAtIndexPath, si vous envoyez les deux messages ci-dessous, le problème est visuellement résolu (avec le coût probable en performance).

[tableView deselectRowAtIndexPath:indexPath animated:YES];
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

Pour que cela fonctionne (pour moi), deselectRowAtIndexPath:animated : doit contenir animated:YES. L'animation utilisée pour reloadRowsAtIndexPaths:withRowAnimation : n'a pas d'importance.

0 votes

J'ai cherché ce problème exact, mais cela n'a pas fonctionné pour moi, les cellules se désélectionnent et ne gardent pas leur couleur de fond que j'ai définie pour la vue sélectionnée. y a-t-il quelque chose qui m'échappe ?

0 votes

Ma réponse concerne uniquement la disparition de la ligne de séparation après avoir tapé sur une cellule. J'avais supposé que la partie de la question concernant la couleur d'arrière-plan n'était qu'une information complémentaire. L'une des solutions de contournement ci-dessous peut être plus appropriée si vous avez des problèmes avec la couleur de fond.

0 votes

Vous appelez deselectRowAtIndexPath dans didSelectRowAtIndexPath, cela ne va-t-il pas automatiquement désélectionner toutes les lignes que vous avez sélectionnées ? Est-ce que quelque chose m'échappe ?

28voto

srivatasa Points 81

Ajoutez ce code à la cellule pour la ligne à indexpath

cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.textLabel.backgroundColor = [UIColor clearColor];

0 votes

C'était la solution pour moi.

0 votes

C'est la bonne réponse. La réponse de @Mark est tout simplement fausse : elle désélectionne ce qui devrait rester sélectionné, ce qui n'a aucun sens.

14 votes

Je suis confus ! cell.selectionStyle = UITableViewCellSelectionStyleNone; rend la sélection des cellules impossible ! comment cela peut-il résoudre la question posée ?

12voto

Jamal Zafar Points 1035

@samvermette's réponse a résolu le problème pour moi, mais j'ai dû désélectionner la rangée sélectionnée d'abord.

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

    //Deselect Row
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];

    // fix for separators bug in iOS 7
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; }

2 votes

Si l'option de sélection multiple est activée dans votre tableau (c'est-à-dire lorsque vous devez utiliser la vue accessoire de la coche), le comportement est en conflit avec votre solution. Le problème est la méthode deselectRowAtIndexPath:animated : appelée lors de la sélection. Existe-t-il une autre solution ?

0 votes

Je n'y arriverais jamais tout seul. Excellente solution.

4voto

sho Points 479

Ce problème semble toujours exister depuis la version 7.0.3 d'iOS, mais je l'ai contourné avec un moyen peu sophistiqué de simuler le séparateur.

En fixant d'abord le UITableView du style de séparateur de l'utilisateur en UITableViewCellSeparatorStyleNone . Vous pouvez alors utiliser un UITableViewCell pour simuler le séparateur entre les cellules pour les états sélectionnés et non sélectionnés :

@implementation MyTableViewCellSubclass

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {

        CGRect frame = self.bounds;
        frame.origin.y = frame.size.height - 1.f;
        frame.size.height = 1.f;

        // Selected background view
        //
        UIView * separatorView = [[UIView alloc] initWithFrame:frame];
        separatorView.backgroundColor = [UIColor darkGrayColor];
        separatorView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleTopMargin;

        UIView * selectedView = [[UIView alloc] initWithFrame:self.bounds];
        selectedView.backgroundColor = [UIColor lightGrayColor];
        [selectedView addSubview:separatorView];

        self.selectedBackgroundView = selectedView;

        // Add separator view to content view for unselected state
        //
        UIView * separatorView2 = [[UIView alloc] initWithFrame:frame];
        separatorView2.backgroundColor = [UIColor darkGrayColor];
        separatorView2.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleTopMargin;

        [self.contentView addSubview:separatorView2];

    }
    return self;
}

@end

0 votes

Cela fonctionne très bien pour mes besoins. Merci, monsieur.

0 votes

La ligne au-dessus de la cellule est toujours manquante. separatorView2 ne couvre pas non plus la zone de la accessorView .

2voto

TrueLifeCoder Points 672

J'ai résolu ce problème (de manière artisanale) en rechargeant non seulement la cellule sélectionnée mais aussi celle qui se trouve juste au-dessus. Aucune des autres solutions ci-dessus n'a fonctionné pour moi.

    NSIndexPath *indexPathOfCellAbove = [NSIndexPath indexPathForRow:(indexPath.row - 1) inSection:indexPath.section];

    if (indexPath.row > 0)
        [self.tableView reloadRowsAtIndexPaths:@[indexPathOfCellAbove, indexPath] withRowAnimation:UITableViewRowAnimationNone];
    else
        [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];

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