L'indentation ne fonctionne pas sur Custom UITableViewCell

J'ai un simple UITableViewCell personnalisé dans mon projet, et juste ajouté une action d'édition à la table. Tout semble bien, mais l'indentation ne fonctionne pas lors de l'édition et les icons d'édition chevauchent le contenu. (Sans oublier le button Supprimer)

L'indentation ne fonctionne pas dans une cellule personnalisée
La cellule personnalisée est créée dans le constructor d'interface, avec les contraintes standard comme d'habitude et j'ai déjà essayé de surcharger la méthode layoutSubviews dans la class, comme mentionné dans d'autres endroits sans chance comme suit;

(void)layoutSubviews { [super layoutSubviews]; float indentPoints = self.indentationLevel * self.indentationWidth; self.contentView.frame = CGRectMake( indentPoints, self.contentView.frame.origin.y, self.contentView.frame.size.width - indentPoints, self.contentView.frame.size.height ); } 

J'ai également confirmé que les sous-vues sont en fait dans le contenu et tout semble bien dans la vue et le code.

Cell a également indentationLevel / Width mis en place par programme et autoresize masques à la largeur automatique.

En dernier recours, je pourrais créer UITableViewCell par programmation, mais je ne pense pas que cela puisse aider.

Conformément à la recommandation, j'ai également veillé à ce que le contenu de Contraintes sur la cellule soit corrigé dans la vue d'set.

Marges fixes sur la gauche

Définir manuellement de autoResizingMasks dans le code sans aucune chance

— Modifier:

J'ai défini manuellement la couleur d'arrière-plan du contenu en noir, et j'ai trouvé qu'il est correctement indenté en mode d'édition, même sans surcharger le "layoutSubviews". En fait, ça marche mieux qu'avec ça.

entrez la description de l'image ici

Cependant, comme vous pouvez le voir, le contenu n'est pas en retrait. Initialement je pensais que le contenu de la cellule (UIImage) n'était pas des sous-vues de contentView, mais nslogging les sous-vues, montre qu'elles le sont.

 NSLog(@"%@", self.contentView.subviews); "<UIImageView: 0xa477030; frame = (23 7; 31 50); autoresize = TM+BM; userInteractionEnabled = NO; layer = <CALayer: 0xa477090>>" 

Je suis complètement perdu sur pourquoi cela continue à se produire ici. Doit être une contrainte cachée liée aux nouvelles contraintes de l'iOS 6.

L'indentation n'est pas la même que l'ajustement de la vue du contenu en entrant en mode d'édition.

Vous avez raison, cela semble simple et fonctionne presque directement hors de la boîte. Généralement, les seules choses que vous devez modifier sont les masques d'autoresizing des composants que vous ajoutez à la cellule. Le contenu à gauche doit avoir une marge gauche fixe, le contenu à droite doit avoir une marge droite fixe.

Lorsque la cellule passe en mode d'édition, la taille de la vue de contenu est ajustée pour laisser de la place aux accessoires d'édition. Si votre contenu a ces masques de redimensionnement, il ira de pair avec cela. Votre méthode layoutSubviews ci-dessus est susceptible d'annuler tout cela en redéfinissant la vue du contenu en pleine largeur car vous utilisez incorrectement l'indentation – bien que je ne puisse en être sûr à partir des informations de la question.

METTRE À JOUR

C'est un problème (bug?) Avec des contraintes dans UITableViewCells. Vous pouvez revenir aux masques autorésisables en sélectionnant l'onglet "Fichier" dans l'écran du storyboard / générateur d'interface (si vous souhaitez utiliser des contraintes ailleurs, utilisez une pointe autonome pour la cellule) et décochez la case "Utiliser la layout automatique":

entrez la description de l'image ici

Cela arrange le contenu de votre cellule correctement.

Vous pouvez essayer ces fonctions et les contourner:

 - (void)willTransitionToState:(UITableViewCellStateMask)state { [super willTransitionToState:state]; if ((state & UITableViewCellStateEditingMask) || (state & UITableViewCellStateShowingDeleteConfirmationMask)) { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.3]; label.alpha = 0.0; 

// Code LayoutSubview [UIView commitAnimations]; }}

 - (void)didTransitionToState:(UITableViewCellStateMask)state { [super didTransitionToState:state]; if (!(state & UITableViewCellStateEditingMask) && !(state & UITableViewCellStateShowingDeleteConfirmationMask)) { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.5]; label.alpha = 1.0; // LayoutSubview code [UIView commitAnimations]; } } 

Décocher "Utiliser Autolayouts" a fait l'affaire pour moi.

Définit l'incrustation de bord tableView sur zéro

 [self.tableView setSeparatorInset:UIEdgeInsetsZero];