83 votes

Centrer le X d'une sous-vue dans l'autolayout génère un message "non préparé pour la contrainte".

J'ai une sous-classe UIView personnalisée qui est initialisée via une nib.

En -awakeFromNib Je crée une vue secondaire et j'essaie de la centrer dans sa vue secondaire.

[self setInteralView: [[UIView alloc] init]];
[[self internalView] addConstraint: [NSLayoutConstraint constraintWithItem: [self internalView]
                                                                 attribute: NSLayoutAttributeCenterX
                                                                 relatedBy: NSLayoutRelationEqual
                                                                    toItem: self
                                                                 attribute: NSLayoutAttributeCenterX
                                                                multiplier: 1
                                                                  constant: 0]];

Cette opération est interrompue et donne lieu à la sortie suivante :

2013-08-11 17:58:29.628 MyApp[32414:a0b] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0xc1dcc80 UIView:0xc132a40.centerX == MyView:0xc1315a0.centerX>
    When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView _viewHierarchyUnpreparedForConstraint:] to debug.
2013-08-11 17:58:29.630 MyApp[32414:a0b] View hierarchy unprepared for constraint.
    Constraint: <NSLayoutConstraint:0xc1dcc80 UIView:0xc132a40.centerX == MyView:0xc1315a0.centerX>
    Container hierarchy: 
<UIView: 0xc132a40; frame = (0 0; 0 0); clipsToBounds = YES; layer = <CALayer: 0xc132bc0>>
    View not found in container hierarchy: <MyView: 0xc1315a0; frame = (-128 -118; 576 804); layer = <CALayer: 0xc131710>>
    That view's superview: <UIView: 0xc131a70; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0xc131b50>>

2voto

Vyacheslav Points 2149

Dans mon cas, le problème a été résolu en utilisant la vue Racine comme conteneur de contraintes au lieu d'une vue actuellement créée.

Je veux dire, utiliser à l'intérieur de viewController

view.addConstraints([leftConstraintImage, topConstraintImage]) au lieu de imageView.addConstraints...

1voto

benvolioT Points 3003

Comme le souligne @CharlesA dans sa réponse, le problème est que la vue que vous ajoutez n'est pas dans la bonne hiérarchie de vues. Sa réponse est bonne, mais je vais donner quelques détails sur un cas d'utilisation particulier qui a causé ce problème pour moi :

Cela s'est produit lorsque j'ai essayé d'ajouter des contraintes à une vue dont j'avais instancié le contrôleur de vue à l'aide de la commande instantiateViewControllerWithIdentifier . Pour résoudre le problème, j'ai utilisé [childViewController didMoveToParentViewController:self] . Cette opération a permis d'ajouter la vue à la hiérarchie des vues référencées par ma contrainte.

0voto

oskarko Points 677

Ajoutez d'abord votre sous-vue, puis ajoutez vos contraintes comme suit

addSubview(yourSubViewHere)
yourSubViewHere.translatesAutoresizingMaskIntoConstraints = false

addConstraint(NSLayoutConstraint(....

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X