如何在Xcode中增加导航栏的高度?

42
我正在开发一款应用程序,在其中需要保留一个导航栏。 当我在栏上编写任何标题时,时间和标题会变得非常接近。我希望增加栏的高度,以便它可以有更多的空间。

你使用Storyboard还是XIB? - Anbu.Karthik
1
我正在使用main.storyboard。 - Mayur Tolani
这里有一个非常好的答案:https://dev59.com/nFwY5IYBdhLWcg3w2K3c - Sirop4ik
也许你可以使用自定义视图来替换导航栏。这样更加灵活。 - 无夜之星辰
11个回答

45

选择你的ViewController——>选择你的Navigation Item——; Prompt——; 添加空格,它会增加导航栏高度

查看图片:enter image description here

程序化:

viewWillAppearviewDidAppear方法中添加以下内容:

Objective-C

[self.navigationController.navigationBar setFrame:CGRectMake(0, 0, self.view.frame.size.width,80.0)];

Swift(苹果开发的编程语言)

self.navigationController.navigationBar.frame = CGRectMake(0, 0, self.view.frame.size.width, 80.0)

Swift-3

self.navigationController!.navigationBar.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 80.0)

iOS 11

enter image description here

Objective-C

for (UIView *subview in self.navigationController.navigationBar.subviews) {
    if ([NSStringFromClass([subview class]) containsString:@"BarBackground"]) {
        CGRect subViewFrame = subview.frame;
        // subViewFrame.origin.y = -20;
        subViewFrame.size.height = 100;
        [subview setFrame: subViewFrame];
    }
}

Swift

for subview in (self.navigationController?.navigationBar.subviews)! {
       if NSStringFromClass(subview.classForCoder).contains("BarBackground") {
            var subViewFrame: CGRect = subview.frame
            // subViewFrame.origin.y = -20;
            subViewFrame.size.height = 100
            subview.frame = subViewFrame

        }

    }

移动白色文本提示符可以正常工作,不确定原因,但没关系 :D - Kingsley Mitchell
1
@Anbu.Karthik,兄弟,你的答案对我有用,但是对于collectionView控制器,导航栏位置在后面,而集合VC滚动视图在前面。我该如何将导航栏设置为前置? - May Phyu
@adev - 请检查更新后的答案,我在iOS 11上测试通过。 - Anbu.Karthik
@Anbu.Karthik,我指的是编程设置事情。我不想设置提示,因为我无法调整左右barbutton项目以保持它在中间。没有能力调整这些按钮看起来很奇怪。我想在代码中进行设置。 - adev
1
是否也可以对导航栏的“增长”进行动画处理?从一个具有较小导航栏的视图控制器切换到下一个具有较大导航栏的视图控制器时,导航栏的过渡不够平滑。 - RaptoX
显示剩余3条评论

18

只需将此行代码添加到您的视图控制器中即可。

navigationController?.additionalSafeAreaInsets.top = 30 
  // where 30 is the extra space, add as per your need. 

1
在我的情况下,我必须隐藏我的状态栏。因此,我通过覆盖视图控制器的方法来实现。这引起了一个问题。当我隐藏状态栏时,我的导航栏会在状态栏未隐藏时上下移动。因此,我需要在状态栏的位置添加空间。上述解决方案对我有效。 - Amit Kumar

15

苹果建议不要调整navigationBar的大小,而是从栏中删除阴影并在navigationBar下添加自定义视图。这对大多数情况都适用。请查看苹果的示例。


你能描述一下你在哪里看到那个提案吗?我在你提供的页面中找不到它。 - Patrick
@Patrick 你需要下载附带的项目。它们有示例实现。 - Timur Bernikovich

12

13
如果链接失效,仅包含链接的答案可能会变得无用。请在帖子本身中提供最少量的说明。 - user5306470
这个链接是 Apple 的长期链接,这里描述的最佳答案。其他答案更像是使用导航栏和导航栏控制器的 hack 而不是方便的方式。 - Nikola Jovic
ExtendedNavBar不是示例Xcode项目的一部分。 - twodayslate
5
该链接指向的示例代码中没有包括增加高度的示例。 - John Scalo

12

将以下扩展添加到您的项目中:

import UIKit

extension UINavigationBar {

    override open func sizeThatFits(_ size: CGSize) -> CGSize {
        return CGSize(width: UIScreen.main.bounds.size.width, height: 80.0)
    }

}

如何调用这个扩展? - Hemang
1
@Hemang 这个方法在您的应用程序中绘制UINavigationBars时会自动调用。您不需要自己调用它。 - odm
18
在 iOS 11 上这个不起作用。即使它被调用,导航栏仍然具有旧的高度。 - adev

11

此解决方案不再适用于 Xcode 8.x.x 及更高版本!

你也可以通过以下步骤增加导航栏的高度,而无需创建自定义导航栏:

步骤1:在Storyboard或XIB中选择导航栏

enter image description here

步骤2:从“Identity Inspector”复制对象ID

enter image description here

步骤3:将Storyboard/XIB打开为源代码

enter image description here

步骤4:在源代码中查找对象ID并将其粘贴到搜索框中

enter image description here

步骤5:编辑高度!就这样

enter image description here

希望这能帮到你


苹果公司允许这个吗?请告诉我。 - iPhoneDev
适用于Xcode 8。只需搜索“navigationBar”并设置高度即可 ;) - Sylar
1
@MeghsDhameliya 这在 Xcode 8.3.3、Xcode 9 和 Xcode 9.2 中都无法工作。 - Ashok Londhe
@AshokLondhe 哦,我会在笔记上更新的,感谢你的更新。 - Meghs Dhameliya
2
为什么通过编辑可视化编辑工具的底层XML作为解决方案会得到赞同? - Alex Bollbach

8
viewWillAppear 方法中添加以下内容。
CGFloat height = 80;
[self.navigationController.navigationBar setFrame:CGRectMake(0, 0,
self.view.frame.size.width,height)];

如果它首先增加,然后缩小到原始高度,那么请在viewDidAppear方法中添加此代码。


1
我的建议是请使用自定义导航栏。 - Abhishek Thapliyal

1
    navigationController?.additionalSafeAreaInsets.top = 25

将以下代码添加到viewDidLoad中,它一定会起作用。在Xcode 12版本中测试成功。


这会更新UINavigationController的整体区域,但UINavigationBar仍然保持在44像素。 - tcone33

1
我们需要每次显示视图时更改导航栏的高度。因此,请将代码放在viewWillAppear中。
override func viewWillAppear(_ animated: Bool) {
     self.navigationController?.navigationBar.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: 80)
}

我们可以将宽度设置为视图的宽度,并随心所欲地更改高度。

导航栏框架已更改,但无法正常工作。我正在使用带有iPhone6s14.2的Xcode12.2。 - MuraliDharan V

0

如果我没记错的话,您无法更改默认的NavigationBar的高度。

但是,您可以创建自定义的NavigationBar并为其添加自定义高度。


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