以编程方式将自动布局约束添加到导航控制器

我正在尝试为我在导航栏上添加的UI标签添加约束。 UI标签显示正在运行的计时器

这是我的代码,

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]]; 

但是当我运行应用程序时,我收到错误“无法修改由控制器管理的UINavigationBar的约束”。

如何添加此约束?

简而言之:你做不到。

导航控制器管理导航栏和可选导航工具栏的创建,配置和显示。 允许自定义导航栏的外观相关属性,但您不能直接更改其框架,边界或Alpha值…导航控制器使用导航项对象动态构建导航栏的内容(UINavigationItem的实例) class)与导航堆栈上的视图控制器相关联

资料来源:Apple Docs

您需要initWithNavigationBarClass:toolbarClass: UINavigationBar ,然后使用initWithNavigationBarClass:toolbarClass:实例化UINavigationController initWithNavigationBarClass:toolbarClass:进一步做一些事情。

虽然如果您正在寻找自定义导航栏的方法,但UIKit用户界面指南是了解您可以做什么的良好开端。 但是,如果它将成为文本标签,请考虑设置栏的title属性。

另一种方法是,将自定义视图作为子视图添加到UINavigationBar ,通过更新.frame属性以旧方式手动设置位置和大小。 它不是一个“灵活”的解决方案,而是简单而快速。

我最后在导航栏上添加了计时器标签作为右键栏项。 这是一种hacky方式。 但由于无法添加约束,因此它是一种解决方法。