web-dev-qa-db-fra.com

Le contenu iOS 7.1 UitableviewCell chevauche celui ci-dessous

J'ai donc du code, qui fonctionne avec succès sur iOS 7.0 mais pas dans 7.1. J'ai une simple vue de table, avec du code:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 10;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 70.0;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    for (UIView *view in cell.contentView.subviews) {
        [view removeFromSuperview];
    }

    UILabel *label = [[UILabel alloc] init];
    label.text = [NSString string];

    for (NSInteger i = 0; i < 20; i++) {
        label.text = [label.text stringByAppendingString:@"label String "];
    }

    label.translatesAutoresizingMaskIntoConstraints = NO;
    label.numberOfLines = 0;
    label.lineBreakMode = NSLineBreakByWorldWrapping;
    //label.lineBreakMode = NSLineBreakByTruncatingTail; //I have tried this too
    [cell.contentView addSubview:label];

    NSDictionary *dict = NSDictionaryOfVariableBindings(label);
    [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-8-[label]-8-|" options:0 metrics:nil views:dict]];
    [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-8-[label]" options:0 metrics:nil views:dict]];

    if (indexPath.row == 0) {
        label.textColor = [UIColor colorWithRed:1.0 green:0 blue:0 alpha:1.0];
    }
    else if (indexPath.row == 1) {
        label.textColor = [UIColor colorWithRed:0 green:1.0 blue:0 alpha:1.0];
    }
    else if (indexPath.row == 2) {
        label.textColor = [UIColor colorWithRed:0 green:0 blue:1.0 alpha:1.0];
    }
    else {
        label.textColor = [UIColor colorWithWhite:0.3 alpha:1.0];
    }

    cell.backgroundColor = [UIColor colorWithWhite:1.0 alpha:1.0];
    return cell;
}

J'ai 1 section avec 10 lignes. Avec chaque ligne réutilisée, je supprime toutes les sous-vues de contentView (j'ai essayé alloc-init UITableViewCell, mais j'ai obtenu les mêmes résultats).

Sur iOS 7.0, UILabel s'affiche uniquement dans la cellule à laquelle il appartient. Mais dans 7.1 UILabel continue d'afficher sur une autre cellule. Ce qui est intéressant, c'est que lorsque je clique sur la cellule, elle cesse d'être superposée par d'autres, mais seulement jusqu'à ce que je clique sur la cellule ci-dessus. Ma question est de savoir comment le faire fonctionner sur des appareils 7.1 comme sur 7.0ones.

J'ai essayé à la fois le simulateur et le périphérique et j'ai jeté un coup d'œil aux différences de l'API iOS 7.1, mais je n'ai rien trouvé à ce sujet.

C'est peut-être le problème de la disposition automatique, que j'ai une hauteur variable de UILabel, mais je dois le faire. Je veux avoir tout le texte dans UILabel, mais n'afficher qu'une partie de UILabel, qui peut être affichée dans une cellule, ce qui est le comportement par défaut dans 7.0, mais 7.1 change cela et je ne sais pas pourquoi et comment y faire face.

Ceci est un dossier dropbox pour les images avec une explication détaillée: Dossier avec des images

Mise à jour: j'ai essayé des choses comme tese, mais rien n'a fonctionné pour moi.

cell.frame = CGRectMake(0, 0, self.tableView.frame.size.width, 70);
cell.contentView.frame = CGRectMake(0, 0, self.tableView.frame.size.width, 70);

cell.opaque = NO;
cell.contentView.opaque = NO;

cell.clearsContextBeforeDrawing = NO;
cell.contentView.clearsContextBeforeDrawing = NO;

cell.clipsToBounds = NO;
cell.contentView.clipsToBounds = NO;
30
Matej Kosiarcik

Le problème est lié à la hauteur de votre cellule. Cela ne va pas ajuster cela dynamiquement pour vous.

Vous remarquerez probablement que lorsque vous faites défiler et que la vue ci-dessus disparaît, le texte qui se chevauche disparaîtra avec.

Si vous souhaitez que votre texte soit coupé à une certaine hauteur, vous devez définir le nombre de lignes, plutôt que de le définir sur 0 car cela le laissera continuer indéfiniment.

lineBreakMode ne prendra pas effet car il n'est pas arrêté.

Vous pouvez éventuellement essayer de définir l'écrêtage sur le contentView pour vous assurer que toutes les sous-vues restent à l'intérieur.

Selon le résultat final que vous souhaitez, vous pouvez effectuer des hauteurs dynamiques et modifier en fonction du contenu. Il y a un tas de SO questions liées à cela.

Mise à jour - découpage du contenu

Je devrais l'essayer moi-même, mais au lieu de cela, voici quelques liens liés à la coupure du contenu

On dirait que cela fonctionne:

cell.clipsToBounds = YES;
62
RyanJM

Voici la solution parfaite de chevauchement de contenu dans les cellules.

Utilisez simplement le code ci-dessous dans cellForRowAtIndexPath après avoir alloué la cellule et avant d'ajouter des sous-vues.

for (id object in cell.contentView.subviews)
{
    [object removeFromSuperview];
}  

En fait, le chevauchement se produit car chaque fois que vous faites défiler la vue de table, il alloue votre vue ajoutée encore et encore. Le code ci-dessus résoudra donc votre problème en supprimant les vues existantes du contenu de la cellule.

Vous pouvez maintenant voir la session de débogage de la mémoire après avoir appliqué le code ci-dessus, votre mémoire est stable cette fois.

J'espère que cela vous aidera.

Merci !

6
Gaurav Singla

@ Gaurav, votre réponse devrait être la réponse acceptée. Merci!

for object in cell.contentView.subviews
            {
                object.removeFromSuperview();
            }
1
Emastmagy MastMagy

avait un comportement similaire dans iOS 8, en utilisant storyboard/IB.

le correctif consistait à ajouter un Bottom Space to: Superview contrainte de la vue la plus basse à la fin de la vue de contenu de la cellule prototype. Les autres vues et contraintes étaient toutes ancrées par le haut.

1
GraehamF

C'est un problème avec la recréation du contenu des cellules. Essayez avec le segment de code suivant.

for(UIView *view in cell.contentView.subviews){  
        if ([view isKindOfClass:[UIView class]]) {  
            [view removeFromSuperview];   
        }
    }
1
Samitha K

Utilisez-vous des storyboards? Si c'est le cas, sélectionnez le contrôleur de vue de table dans les story-boards et décochez la case "Sous les barres inférieures". Vous pouvez également le faire par programme.

Si votre TVC hérite d'un contrôleur de vue de navigation ou d'un contrôleur de vue d'onglet, vous devrez peut-être décocher cette option de disposition sur la vue parent à la place.

0
TooManyEduardos