更改UINavigationBar高度

22

有人能告诉我如何改变导航栏的高度吗?

以下是我目前所拥有的:

CGFloat navBarHeight = 10;
self.navigationController.navigationBar.frame.size.width = navBarHeight;

2
frame.size.width? - Kendall Helmstetter Gelner
这是一个重复的问题:https://dev59.com/CEfRa4cB1Zd3GeqP_K5J。 - Brad Larson
这已经不再可能了。请查看底部的答案。 - ghr
12个回答

25
你可以像这样创建一个基于UINavigationBar的分类类:

.h 文件

#import UIKit/UIKit.h    
@interface UINavigationBar (myNave)
- (CGSize)changeHeight:(CGSize)size;
@end

和 .m 文件

#import "UINavigationBar+customNav.h"
@implementation UINavigationBar (customNav)
- (CGSize)sizeThatFits:(CGSize)size {
    CGSize newSize = CGSizeMake(320,100);
    return newSize;
}
@end

它工作得非常好。


这个代码可以运行,但是会将UINavigationItem移动到顶部,导致标题和项目不再水平居中对齐。 - Anand
@Anand:同样的问题,有什么解决方案吗? - Ashvin
1
要重新调整标题位置,请使用[self.navigationBar setTitleVeritcalPositionAdjustment:(float) forBarMetrics:UIBarMetricsDefault];,其中float是正值将标题向下推,负值将其向上推。因此,如果您的导航栏高度为44(默认值),并且您将其设置为60,则将float设置为-8((60-44)/ 2)以重新居中它。 - Mr.P

21

不应该改变导航栏的高度。来自苹果编程指南中的视图控制器:

自定义导航栏外观

在导航界面中,导航控制器拥有其UINavigationBar对象并负责管理它。不能直接更改导航栏对象或修改其边界、框架或alpha值。但是,有一些属性可以修改,包括以下内容:

● barStyle 属性

● translucent 属性

● tintColor 属性

(摘自苹果: https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/NavigationControllers.html)

-- 更新 -- IOS 7 ---仍然只能更改可用的属性,但以下是一个很好的教程,介绍如何实现导航栏的灵活性: http://www.appcoda.com/customize-navigation-status-bar-ios-7/


1
这在iOS7指南中似乎不再存在。它仍然列出了可直接访问的属性,但没有提到任何被禁止修改的内容。 - Oliver Mason
1
仍然会出现,请参见-https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/NavigationControllers.html - Gil Margolin
1
确实是这样——我错过了那个。谢谢。 - Oliver Mason
2
不回答问题。 - Zoyt
6
但要防止应用程序被拒绝! - Gil Margolin

8

我已经解决了这个问题,我创建了UINavigationController的子类。在MainNavigationViewController.m文件中,我重写了viewDidLayoutSubviews()方法,在其中设置了self.navigationBar的框架。


8

sizeThatFits方法在iOS11中不再适用于UINavigationBar的子类。Apple工程师已经确认这一技术从未获得支持,并且随着iOS11的变化,sizeThatFits方法将不再被调用。


6

在视图控制器中覆盖-(void)viewWillAppear方法,尝试以下代码:

- (void)viewWillAppear {

UINavigationBar *navigationBar = [[self navigationController] navigationBar];
CGRect frame = [navigationBar frame];
frame.size.height = 82.0f;
[navigationBar setFrame:frame];
}

1
接近了,但它会重叠底层视图而不是移动它。 - rwyland
1
可能是由于您的导航栏样式所致。如果它是半透明类型,那么它会重叠视图。我认为如果它是不透明的,那么子视图可能会自动向下移动。 - Augustine P A
2
不行,44像素的不透明度还好,但之后的内容会重叠。我还发现navigationBar框架会在屏幕旋转或应用程序恢复时重置(viewWillAppear不会在应用程序恢复时调用)。所以遗憾的是,这个hack无法正常工作。 - rwyland

5

尝试使用 -

CGFloat navBarHeight = 10.0f;    
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight);
[self.navigationController.navigationBar setFrame:frame];

4
实际上并没有改变任何东西。我尝试在AppDelegate中创建UINavigationController时设置框架。没有出现任何错误信息,但导航栏的高度根本没有改变。在Xcode 4.4和iOS 4.3、5.0、5.1上进行了测试。 - jcsahnwaldt Reinstate Monica

4
最简单有效的解决方案是将一个分类添加到导航栏中。(但可能不是最佳解决方案)
@interface UINavigationBar (CustomHeight)

@end


@implementation UINavigationBar (CustomHeight)

- (CGSize)sizeThatFits:(CGSize)size {
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    return CGSizeMake(screenRect.size.width, kNavBarHeightNoStatus);
}
@end

knavBarHeightNoStatus是您导航栏的高度。我们使用UIScreen边界,因为UINavigationBar的框架是错误的。

PS:注意,如果与SideMenu一起使用可能会出现一些问题。


3

self.navigationController.navigationBar.frame是iOS 4.x版本上的一个只读属性。即使在状态异常的情况下,它也会改变。

例如,当应用程序的状态更改为后台并返回前台时,导航栏将显示原始高度。


2
我遇到了很多问题,这取决于所选择的方法。在我的具体情况下,导航栏在整个应用程序中都被隐藏,除了在设置视图控制器中。由于我需要指定导航栏的自定义高度并同时显示导航栏,源视图控制器和设置视图控制器之间的跳转动画非常不连贯。
最佳解决方案可以在这里找到:https://gist.github.com/maciekish/c2c903d9b7e7b583b4b2。我只是将该类别导入到设置视图控制器中,并在viewDidLoad 中调用 `self.navigationController.navigationBar` 的 setHeight: 方法。看起来很好!

1

以下代码不会影响除高度以外的框架中的其他参数

 [self.navigationController.navigationBar setFrame:CGRectMake(self.navigationController.navigationBar.frame.origin.x, self.navigationController.navigationBar.frame.origin.y, self.navigationController.navigationBar.frame.size.width, 150)];

如果您想更改其他参数,只需编辑其中任何一个参数即可。

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