Centering subview's X in autolayout throws "not prepared for the constraint" Centering subview's X in autolayout throws "not prepared for the constraint" ios ios

Centering subview's X in autolayout throws "not prepared for the constraint"


For others who come here: I got this error, because I added the constraints before I added the subviews to the hierarchy.


As the error states, you must add the constraint to a view such that the views involved in the constraint are the view you're adding it to or a subview of that view. In the case of your code above, you should be adding that constraint to self, rather than [self internalView]. The reason it doesn't work as written is one of the views involved in the constraint (self) is not in the view hierarchy if you consider only [self internalView] and below).

For more details, see the discussion section of the documentation on the addConstraint: method.

Here is your line of code, fixed as I suggest:

UIView* internalView = [[UIView alloc] initWithFrame:CGRectZero];internalView.translatesAutoresizingMaskIntoConstraints = NO;[self setInternalView:internalView];[self addConstraint: [NSLayoutConstraint constraintWithItem: [self internalMapView]                                         attribute: NSLayoutAttributeCenterX                                         relatedBy: NSLayoutRelationEqual                                         toItem: self                                         attribute: NSLayoutAttributeCenterX                                         multiplier: 1                                         constant: 0]];


Short answer: swap parent and child view.
Assuming self is the parent view:

  • bad: [subview addConstraint [NSLayoutConstraint constraintWithItem:self...

  • good: [self addConstraint [NSLayoutConstraint constraintWithItem:subview...


Swift

subview.translatesAutoresizingMaskIntoConstraints = falseself.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(    "H:|-0-[subview]-0-|",    options: .DirectionLeadingToTrailing,    metrics: nil,    views: ["subview":subview]))

Obj-C

[subview setTranslatesAutoresizingMaskIntoConstraints:NO];[self addConstraints:[NSLayoutConstraint                      constraintsWithVisualFormat:@"H:|-0-[subview]-0-|"                      options:NSLayoutFormatDirectionLeadingToTrailing                      metrics:nil                      views:NSDictionaryOfVariableBindings(subview)]];