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?
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.
Another way, after adding your custom view as a subview to UINavigationBar
, manually setup position and size with an old fashion way by updating .frame
property. It isn't a "flexible" solution, but simple and fast.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With