web-dev-qa-db-fra.com

Le contenu UITableViewCell chevauche le bouton de suppression en mode édition sous iOS7.

Je crée une UITableView avec UITableViewCells personnalisé. Le nouveau bouton de suppression d'iOS 7 provoque des problèmes de mise en page de ma cellule.

Si j'utilise le bouton "Modifier", ce qui fait apparaître les cercles rouges, le problème me pose problème, mais si je glisse une seule cellule, elle a l'air parfaite.

C'est quand le bouton Edit est utilisé:

[self.tableView setEditing:!self.tableView.editing animated:YES];

Content overlaps the delete button

C'est quand je glisse une seule cellule:

Content is placed right

Comme vous pouvez le voir, mes étiquettes chevauchent le bouton Supprimer du premier exemple. Pourquoi fait-il cela et comment puis-je le réparer?

15
Thomas Clemensen

essayez d’utiliser les propriétés accessoryView et editingAccessoryView de votre UITableViewCell au lieu d’ajouter la vue vous-même.

Si vous souhaitez que le même indicateur soit affiché en mode édition et en mode non-édition, essayez de définir les deux propriétés de la vue pour qu'elles pointent sur la même vue dans votre uiTableViewCell comme:

self.accessoryView = self.imgPushEnabled;
self.editingAccessoryView = self.imgPushEnabled;

Il semble y avoir un petit problème dans l’animation de modification de table dans IOS7, ce qui confère un chevauchement du bouton de suppression et de la variable accessoryView lors du retour à l’état non modifié. Cela semble se produire lorsque accesoryView est spécifié et que editingAccessoryView est nil.

Une solution de contournement à ce problème semble être de spécifier une édition invisible AccessAccessoryView comme:

self.editingAccessoryView =[[UIView alloc] init];
self.editingAccessoryView.backgroundColor = [UIColor clearColor];
7
EsbenB

J'ai résolu ce problème avec des contraintes de configuration sans largeur, mais uniquement en tête et en fin.

4
Misha Vyrko

Le problème est que, en mode édition, la taille de contentView de la cellule change. Donc, soit vous devez remplacer layoutSubviews dans votre cellule et prendre en charge les différentes tailles de trame

- (void) layoutSubviews
{
    [super layoutSubviews];
    CGRect contentFrame = self.contentView.frame;
    // adjust to the contentView frame
    ...
}

ou vous mordez à l'hameçon et passez en autolayout.

Premièrement, je pensais que régler contentView.clipsToBounds sur YES pourrait être une solution de contournement laide, mais cela ne semble pas fonctionner.

4
tcurdt

Comme cela a été mentionné, vous pouvez passer à l'autolayout pour résoudre ce problème. Mais, si vous ne voulez pas (naturellement) vouloir jouer avec l'autolayout pour cette seule instance, vous pouvez définir le masque autoresizing et le transformer automatiquement en contraintes appropriées pour autolayout.

label.autoresizingMask = UIViewAutoresizingFlexibleWidth;
2
Matthew Horst

Utilisez simplement cette méthode dans votre classe TableViewCell personnalisée pour obtenir la réponse parfaite.

Ici self est UITableviewCell

- (void)layoutSubviews {

[super layoutSubviews];

    for (UIView *subview in self.subviews) {

    for (UIView *subview2 in subview.subviews) {

        if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) { // move delete confirmation view

            [subview bringSubviewToFront:subview2];

        }
     }
  }
}
2

Et si quelqu'un veut ajuster la taille du bouton Supprimer, utilisez le code suivant

- (void)layoutSubviews {

    [super layoutSubviews];

    for (UIView *subview in self.subviews) {

        for (UIView *subview2 in subview.subviews) {

            if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) { // move delete confirmation view

                CGRect rect = subview2.frame;
                rect.size.height = 47; //adjusting the view height
                subview2.frame = rect;

                for (UIButton *btn in [subview2 subviews]) {

                    if ([NSStringFromClass([btn class]) isEqualToString:@"UITableViewCellDeleteConfirmationButton"]) { // adjusting the Button height
                        rect = btn.frame;
                        rect.size.height = CGRectGetHeight(subview2.frame);
                        btn.frame = rect;

                        break;
                    }
                }

                [subview bringSubviewToFront:subview2];

            }
        }
    }
}
2

Afficher UITableViewCellDeleteConfirmationView dans la layoutSubviews de la cellule personnalisée fonctionne pour moi sur iPhone, mais pas sur iPad. 

J'ai une UITableView dans la partie principale d'une splitViewController pour iPad, et dans ce cas Le cadre de la UITableViewCellDeleteConfirmationView est (768 0; 89 44) au lieu de (320 0; 89 44)

Donc, je redimensionne le cadre dans la méthode layoutSubviews et cela fonctionne pour moi

- (void)layoutSubviews {
    [super layoutSubviews];
    for (UIView *subview in self.subviews) 
    {
        for (UIView *subview2 in subview.subviews) 
        {
            if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) 
            { 
                CGRect frame = subview2.frame;
                frame.Origin.x = 320;
                subview2.frame = frame;
                [subview bringSubviewToFront:subview2];
           }
        }
    }
}
1
lmascherpa

Le meilleur moyen de supprimer ce problème est d’ajouter une image dans une cellule et de la définir dans Verso.

      UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bgImg.png"]];
      imageView.frame = CGRectMake(0, 0, 320, yourCustomCell.frame.size.height);
      [yourCustomCell addSubview:imageView];
      [yourCustomCell sendSubviewToBack:imageView];

Si votre texte chevauche le bouton de suppression, implémentez Autolayout. Ça va mieux gérer.

Un autre cas peut être généré, c'est-à-dire que cellSelectionStyle serait mis en surbrillance avec la couleur par défaut. Vous pouvez définir la couleur de surbrillance comme suit

      yourCustomCell.selectionStyle = UITableViewCellSelectionStyleNone;

Définissez le style de sélection de votre cellule de tableau sur UITableViewCellSelectionStyleNone. Cela supprimera le fond bleu en surbrillance ou autre. Ensuite, pour que l'étiquette de texte ou la vue de contenu mettant en surbrillance fonctionne comme vous le souhaitez, utilisez cette méthode dans la classe yourCustomCell.m.

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

J'espère que vous comprenez mieux.

1
chandan

Si vous placez du contenu dans le contentView de UITableViewCell, assurez-vous d'utiliser self.contentView.frame.size.width et non self.frame.size.width dans layoutSubviews. 

self.frame agrandit la largeur en mode édition et fait en sorte que tout le contenu à droite dépasse les limites de contentView. self.contentView.frame reste à la largeur correcte (et est ce que vous devriez utiliser).

1
delrox

Ma solution consiste à déplacer tout le contenu de la vue vers la gauche lorsque le bouton Supprimer affiche:

override func layoutSubviews() {
    super.layoutSubviews()

    if editingStyle == UITableViewCellEditingStyle.Delete {
        var rect = contentView.frame
        rect.Origin.x = self.showingDeleteConfirmation ? -15 : 38
        contentView.frame = rect
    }
}
0
Tony

Essayez ceci: vous définissez peut-être la cellule setBackgroundImage dans cellForRowAtIndexPath (Méthode Delegate). Ne définissez pas ceci ici. Définissez votre image en:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { cell.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"cellList.png"]]; }

Profitez de codage.

0
ios