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

Posted

技术标签:

【中文标题】以编程方式向导航控制器添加自动布局约束【英文标题】:Adding autolayout constraints to navigation controller programmatically 【发布时间】:2015-02-24 23:02:58 【问题描述】:

我正在尝试将约束添加到我在导航栏上添加的 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 的约束”。

如何添加此约束?

【问题讨论】:

【参考方案1】:

简而言之:你不能。

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

Source: Apple Docs

您需要将UINavigationBar 子类化,然后使用initWithNavigationBarClass:toolbarClass: 实例化UINavigationController 以做进一步的事情。

如果您正在寻找自定义导航栏的方法,UIKit User Interface Guide 是了解您可以做什么的良好开端。但是,如果它将是一个文本标签,请考虑设置栏的 title 属性,例如。

【讨论】:

我已经有了标题。我必须添加一个在导航栏上显示计时器的标签。唯一的解决方法是子类化导航栏?【参考方案2】:

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

【讨论】:

【参考方案3】:

我最终将计时器标签添加为导航栏上的右键栏项目。这是一种 hacky 方法。但由于无法添加约束,因此这是一种解决方法。

【讨论】:

你不能像这样创建简单的 titleView 并将其添加到导航栏:self.navigationItem.titleView = titleView; 吗?

以上是关于以编程方式向导航控制器添加自动布局约束的主要内容,如果未能解决你的问题,请参考以下文章

嵌入导航控制器时 Xcode 滚动视图自动布局问题?

如何以编程方式使用自动布局添加自定义视图

如何向在 tabcontroller 中以编程方式创建的导航控制器中的 barbuttonitem 添加操作

以编程方式添加控制器视图时自定义自动布局约束被破坏

以编程方式创建的 rootviewcontroller 未显示分配的 viewcontroller 的内容

以编程方式将约束添加到导航栏 Swift