Le complément d'enquête (l'affichage de la sous-vue de la hiérarchie de la cellule) Interface Builder, la place des sous-vues au sein de la cellule de l' contentView
, il ne ressemble pas à elle.
La cause racine du problème iOS 6 mise en page automatique. Lorsque la cellule est placée en mode d'édition (et retrait) l' contentView
est également en retrait, donc il va de soi que toutes les sous-vues au sein de l' contentView
vont évoluer (tiret) en vertu de l'étant au sein de l' contentView
. Cependant, toute la mise en page automatique des contraintes appliquées par Interface Builder semblent être par rapport à l' UITableViewCell
lui-même, plutôt que de l' contentView
. Cela signifie que même si l' contentView
tirets, les sous-vues contenues dans n' - les contraintes de prendre en charge.
Par exemple, lorsque j'ai placé un UILabel
dans la cellule (et l'a placé 10 points à partir de la gauche de la cellule) IB automatiquement appliqué une contrainte de "l'Espace Horizontal (10)". Cependant, cette contrainte est relative à l' UITableViewCell
PAS contentView
. Cela signifie que lorsque la cellule est en retrait, et l' contentView
se déplace, l'étiquette reste en place comme il est en conformité avec la contrainte de rester 10 points à partir de la gauche de l' UITableViewCell
.
Malheureusement (pour autant que je suis au courant) il n'y a aucun moyen de supprimer ces IB créé des contraintes de l'intérieur de l'IB lui-même, donc, voici comment j'ai résolu le problème.
Au sein de l' UITableViewCell
sous-classe de la cellule, j'ai créé un IBOutlet
pour que la contrainte appelés cellLabelHSpaceConstraint
. Vous avez également besoin d'un IBOutlet
pour l'étiquette elle-même, que j'ai appelée" cellLabel
. J'ai ensuite mis en œuvre l' -awakeFromNib
méthode que ci-dessous:
- (void)awakeFromNib {
// -------------------------------------------------------------------
// We need to create our own constraint which is effective against the
// contentView, so the UI elements indent when the cell is put into
// editing mode
// -------------------------------------------------------------------
// Remove the IB added horizontal constraint, as that's effective
// against the cell not the contentView
[self removeConstraint:self.cellLabelHSpaceConstraint];
// Create a dictionary to represent the view being positioned
NSDictionary *labelViewDictionary = NSDictionaryOfVariableBindings(_cellLabel);
// Create the new constraint
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-10-[_cellLabel]" options:0 metrics:nil views:labelViewDictionary];
// Add the constraint against the contentView
[self.contentView addConstraints:constraints];
}
En résumé, le ci-dessus va supprimer l'espacement horizontal de la contrainte qui l'IB automatiquement ajouté (comme c'est efficace contre l' UITableViewCell
plutôt que de l' contentView
) et nous avons ensuite définir et d'ajouter nos propres limites, à l' contentView
.
Dans mon cas, tous les autres UILabels
dans la cellule ont été positionnées en fonction de la position de l' cellLabel
donc quand je fixe la contrainte de positionnement, de cet élément, tous les autres ont suivi, et correctement positionné. Toutefois, si vous avez une disposition plus complexe, alors vous pouvez avoir besoin de faire cela pour d'autres sous-vues ainsi.