Is there a way to add an identifier to Auto Layout Constraints in Interface Builder?
Update:
As explained by Bartłomiej Semańczyk in his answer, there is now an Identifier field visible in the Attributes Inspector for the NSLayoutConstraint
making it unnecessary to expose this field yourself. Just select the constraint in the Document Outline view or in the Storyboard view and then add an identifier in the Attributes Inspector on the right.
Earlier Answer:
Yes, this can be done. NSLayoutConstraint
has a property called identifier
than can be exposed in Interface Builder and assigned. To demo this, I created a Single View Application that has a single subview that is a red box. This subview has 4 constraints: width, height, centered horizontally in container, centered vertically in container. I gave the width constraint the identifier redBoxWidth
by doing the following:
Click on the width constraint in the Document Layout View. Then in the Identity Inspector under User Defined Runtime Attributes, click on the
+
under Key Path. Change keyPath to identifier, change the Type Boolean to String, and set the Value toredBoxWidth
.Then in
ViewDidLoad
it is possible to find the constraint by name and change its value:class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() for subview in view.subviews as [UIView] { for constraint in subview.constraints() as [NSLayoutConstraint] { if constraint.identifier == "redBoxWidth" { constraint.constant = 300 } } } } }
- Since Xcode 7 you can do it in storyboard:
However if you set up your constraint in code, do the following:
let constraint = NSLayoutConstraint() constraint.identifier = "identifier"
For these constraints you have set up in storyboard, but you must set identifier in code:
for subview in view.subviews { for constraint in subview.constraints() { constraint.identifier = "identifier" } }
Also you could link constraint to properties of your controller as you do for any other components. Just ctrl drag it into your code:
And then it will be accessible in code of your controller as property:
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *myConstraint;
And you could change it value for example:
self.myConstraint.constant=100.;