Stanislav Smida Stanislav Smida - 4 months ago 56
iOS Question

Auto Layout: layoutMarginsGuide

How to rewrite visual format

addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("|-[label]-|", options: .AlignAllBaseline, metrics: nil, views: ["label": label]))
addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[label]-|", options: .AlignAllCenterX, metrics: nil, views: ["label": label]))

by moving to layout guides (with margins)?

I tried it with

label.topAnchor.constraintEqualToAnchor(layoutMarginsGuide.topAnchor).active = true
label.leftAnchor.constraintEqualToAnchor(layoutMarginsGuide.leftAnchor).active = true
label.bottomAnchor.constraintEqualToAnchor(layoutMarginsGuide.bottomAnchor).active = true
label.rightAnchor.constraintEqualToAnchor(layoutMarginsGuide.rightAnchor).active = true

but does not work. Even
does not have expected value (yes I call it in
is executed). Constraints are set, but acts like there is zero margin. It layouts and gives expected
only when the layout margin is set to negative; which is not what I want obviously, but demonstrates that constraints are set with margins guides. Looks like I'm missing something...


It seems to me that layoutMarginsGuide is not ready in the init method of a UIView. I'm also getting similar issues, where setting up the constraints in updateConstraints just works. Still investigating why.

UPDATE: What I was trying to do was set the layoutMargins before the view had been added to a superview (in the init). That didn't work. What did work was setting the constraints in the init, relative to layoutMarginsGuide, but actually setting the layoutMargins in viewDidMoveToSuperView.