Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way to add an identifier to Auto Layout Constraints in Interface Builder?

Tags:

After doing some visual layout in Interface Builder I've created some constraints that I want to access at runtime. Is there a way to label or identify constraints in Interface Builder so they can be looked-up later?

The reason I want to do this is I need to perform some calculation base upon the constraints that are visually specified. I am aware that Apple has provided the Visual Format Language and I could specify the constraints programmatically in a controller. I rather not use this approach so I don't lose the design time feedback of IB.

Edit

Making a referencing outlet did work, but the question still stands.

like image 210
Martin Woolstenhulme Avatar asked Jan 06 '15 03:01

Martin Woolstenhulme


People also ask

How do I add constraints in Xib?

Select the options for aligning the selected views, and click the Add Constraints button. Interface Builder creates the constraints needed to ensure those alignments.

How do I create a constraint in Autolayout?

To create constraints select the button and click the Align icon in the auto layout menu. A popover menu will appear, check both “Horizontal in container” and “Vertically in container” options to center the button on the screen. Then click the “Add 2 Constraints” button. Run the application.

How do you add constraints in storyboard IOS?

Open the Align menu with the yellow button selected and check Horizontally in Container, then click Add 1 Constraint. Now, select both buttons at the same time using the Shift key and, in the Align menu, check Leading Edges. Again, actually install the constraint by clicking Add 1 Constraint.


2 Answers

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:

  1. 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 to redBoxWidth.

    naming a constraint

  2. 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                 }             }         }     } } 
like image 99
vacawama Avatar answered Oct 22 '22 20:10

vacawama


  1. Since Xcode 7 you can do it in storyboard:

enter image description here

  1. However if you set up your constraint in code, do the following:

    let constraint = NSLayoutConstraint()  constraint.identifier = "identifier" 
  2. 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"     } } 
like image 43
Bartłomiej Semańczyk Avatar answered Oct 22 '22 20:10

Bartłomiej Semańczyk