【问题标题】:Add layout constraints in UINavigationBar programmatically以编程方式在 UINavigationBar 中添加布局约束
【发布时间】:2026-01-01 19:40:01
【问题描述】:

我有一个 UIViewController 显示一个带有 UINavigationBar 的视图。此 UINavigationBar 是在 UINavigationController 中自动创建的。

我想在第一个 UINavigationBar 的顶部显示第二个 UINavigationBar,用于特定模式,并带有顶部的翻译动画。

我发现由于 UINavigationBar 是自动创建的,因此在第一个 UINavigationBar 中添加第二个 UINavigationBar 会更容易,只需简单:

[self.navigationController.navigationBar addSubview:secondNavigationBar];

我现在正在尝试添加一个“y”约束,以便能够翻译 secondNavigationBar:

self.secondNavigationBarTopConstraint = [NSLayoutConstraint constraintWithItem:secondNavigationBar
                                                                      attribute:NSLayoutAttributeTop
                                                                      relatedBy:NSLayoutRelationEqual
                                                                         toItem:self.navigationController.navigationBar
                                                                      attribute:NSLayoutAttributeTop
                                                                     multiplier:1.0
                                                                       constant:-secondNavigationBar.height];

那么,

    [self.navigationController.navigationBar addConstraint: self.secondNavigationBarTopConstraint];

告诉我

无法修改由 a 管理的 UINavigationBar 的约束 控制器

[self.view addConstraint: self.secondNavigationBarTopConstraint];

告诉我

视图层次结构没有为约束做好准备

我不熟悉自动布局约束...非常感谢您的帮助 :) 谢谢!

【问题讨论】:

    标签: ios autolayout nslayoutconstraint


    【解决方案1】:

    您可以尝试手动设置框架,而不是使用约束,如下所示:

    self.navigationController.navigationBar.frame = CGRectMake(0, 44, screenWidth, screenHeight)

    这将使 navBar 距离顶部 44 像素,允许空间插入另一个条

    【讨论】:

    • 如果方向改变或导航栏大小改变,这将不起作用。
    • 绝对有效,这是 iOS 中经典的程序化 UI。当方向改变时你会得到一个回调,你将使用相同的代码来相应地调整导航栏的大小@windup