Adding autolayout constraints to navigation controller programmatically

autolayout, ios, ios-autolayout

Solution

In short: you can't.

The navigation controller manages the creation, configuration, and display of the navigation bar and optional navigation toolbar. It is permissible to customize the navigation bar’s appearance-related properties but you must never change its frame, bounds, or alpha values directly ... A navigation controller builds the contents of the navigation bar dynamically using the navigation item objects (instances of the UINavigationItem class) associated with the view controllers on the navigation stack

Source: Apple Docs

You would need to subclass the `UINavigationBar` and then instantiate the `UINavigationController` using `initWithNavigationBarClass:toolbarClass:` to do something further.

Though if you're looking for ways to customize the navbar, UIKit User Interface Guide is a good start to know what you may be able to do. But if it's going to be a text label, consider setting the bar's `title` property, for example.

Problem

I am trying to add constraints to a UI label I added on a navigation bar. The UI label shows a running timer Here is my code, ``` self.label = [[UILabel alloc] initWithFrame:CGRectMake(550, 15, 150, 14)]; self.label.text = @"Label"; [self.label setTranslatesAutoresizingMaskIntoConstraints:NO]; [self.navigationController.navigationBar addSubview:self.label]; [self.navigationController.navigationBar addConstraint:[NSLayoutConstraint constraintWithItem:self.label attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.navigationController.navigationBar attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:-20.0f]]; ``` But I get the error 'Cannot modify constraints for UINavigationBar managed by a controller' when I run the app. How do I add this constraint?

Original source