La difficulté avec mise en page automatique sur UITableViewCell

Je vais avoir des ennuis avec mise en page automatique sur un xcode 5 projet. Je suis en utilisant un simple vue-contrôleur à l'intérieur avec une manette de navigation. J'ai un MKMapView sur la moitié supérieure et une UITableView sur la moitié inférieure. Je suis à l'aide de storyboards, et que vous avez configuré le prototype UITableViewCell, mais je suis ajoutant des contraintes à l'aide de code. J'ai vérifié tous les contrôles dans le prototype et ne vois pas de contraintes configuré. Mon problème survient lorsque je ajouter des contraintes pour le UITableViewCell. J'ai le code suivant dans les cellules:

-(void)updateConstraints {
    [super updateConstraints];
    //first remove old constraints
    [self removeConstraints:self.constraints];
    [self.nameLabel removeConstraints:self.nameLabel.constraints];
    [self.addressLabel removeConstraints:self.nameLabel.constraints];
    [self.rentableSquareFeetLabel removeConstraints:self.rentableSquareFeetLabel.constraints];
    [self.lastSaleAmountLabel removeConstraints:self.lastSaleAmountLabel.constraints];
    [self.lastSaleDateLabel removeConstraints:self.lastSaleAmountLabel.constraints];
    [self.thumbnailImageView removeConstraints:self.thumbnailImageView.constraints];

    //then set up constraints
    NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_thumbnailImageView, _nameLabel, _rentableSquareFeetLabel, _lastSaleAmountLabel, _addressLabel, _lastSaleDateLabel);
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_thumbnailImageView(60)]-[_nameLabel(<=200)]-(>=8)-[_rentableSquareFeetLabel]-(>=8)-[_lastSaleAmountLabel]|" options:0 metrics:nil views:viewsDictionary]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_nameLabel]-(-4)-[_addressLabel]" options:NSLayoutFormatAlignAllLeading metrics:nil views:viewsDictionary]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_lastSaleAmountLabel]-(-4)-[_lastSaleDateLabel]" options:NSLayoutFormatAlignAllLeading metrics:nil views:viewsDictionary]];
}

Je suis arriver au suivant dans la console de débogage. L'exception est déclenchée par la première addConstraints ligne. Si j'ai tout simplement continuer à travers ces puis finalement tout s'affiche comme il se doit, comme il semble que xcode est le choix de rompre la bonne contrainte:

2013-09-25 15:07:14.169 PECProperties[32381:a0b] Unable to simultaneously satisfy constraints.  Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)  (
    "<NSIBPrototypingLayoutConstraint:0x9d56c70 'IB auto generated at build time for view with fixed frame' H:|-(0)-[UIImageView:0x9d558f0](LTR)   (Names: '|':UITableViewCellContentView:0x9d55620 )>",
    "<NSIBPrototypingLayoutConstraint:0x9d56d20 'IB auto generated at build time for view with fixed frame' H:[UIImageView:0x9d558f0(60)]>",
    "<NSIBPrototypingLayoutConstraint:0x9d56d80 'IB auto generated at build time for view with fixed frame' H:|-(78)-[UILabel:0x9d559e0](LTR)   (Names: '|':UITableViewCellContentView:0x9d55620 )>",
    "<NSLayoutConstraint:0x9d53830 H:[UIImageView:0x9d558f0]-(NSSpace(8))-[UILabel:0x9d559e0]>" )

Will attempt to recover by breaking constraint  <NSIBPrototypingLayoutConstraint:0x9d56d80 'IB auto generated at build time for view with fixed frame' H:|-(78)-[UILabel:0x9d559e0](LTR)   (Names: '|':UITableViewCellContentView:0x9d55620 )>

Break on objc_exception_throw to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

La troisième NSIBPrototypingLayoutConstraint montre que 78 points entre le bord de la vue et une étiquette. C'est là que le prototype est positionné à peu près (et si je la déplace dans le prototype, je vois la variation de la contrainte dans la console de débogage), mais qui est en conflit avec mon propre contrainte de distance "standard" entre l'affichage de l'image et de l'étiquette.

J'ai essayé le réglage de la translatesAutoresizingMaskIntoConstraints=NO dans la vue du contrôleur de cellForRowAtIndexPath, mais qui ne semble pas être l'aider non plus. Comment puis-je corriger la mise en page?

  • J'ai remarqué un tout-en-un bug dans iOS7 qui a causé un problème similaire. J'étais en précisant toutes les contraintes de l'IB et XCode était heureux. Mais la somme de toutes les verticales tailles à l'exception < la hauteur de la cellule. La solution a été la un - pour supprimer une des contraintes au moment de la construction.