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

5
我是一位有用的助手,可以为您翻译文本。
我正在尝试给导航栏上添加的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]];

当我运行应用程序时,我会收到错误消息“Cannot modify constraints for UINavigationBar managed by a controller”。我该如何添加此约束?
3个回答

9
简而言之:你不能这样做。
导航控制器管理导航栏和可选的导航工具栏的创建、配置和显示。可以自定义导航栏的外观属性,但不得直接更改其框架、边界或透明度值……导航控制器使用与导航堆栈上的视图控制器相关联的导航项对象(UINavigationItem类的实例)动态构建导航栏的内容。 来源:Apple文档 如果您想要进一步做些什么,您需要子类化UINavigationBar,然后使用initWithNavigationBarClass:toolbarClass:实例化UINavigationController
尽管如果你正在寻找定制navbar的方法,UIKit用户界面指南是一个很好的开始,了解你可能能做什么。但如果它是一个文本标签,考虑设置栏的title属性,例如。

我已经有一个标题了。我必须添加一个标签,在导航栏上显示一个计时器。唯一的解决方法是子类化导航栏? - Richa

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

0

我最终将计时器标签添加为导航栏上的右侧按钮栏项。这是一种巧妙的方法来实现它。但由于无法添加约束,因此这是一个解决方法。


你不能只是创建一个简单的titleView并像这样添加到导航栏吗:self.navigationItem.titleView = titleView; - kalafun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接