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)]];