更改UINavigationBar高度

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

这是我迄今为止:

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

你可以像这样创build一个基于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 

它工作得很好。

你不应该改变导航栏的高度。 从Apple View Controller的程序指南:

自定义导航栏外观

在导航界面中,导航控制器拥有它的UINavigationBar对象,并负责pipe理它。 不允许更改导航栏对象或直接修改其边界,框架或Alpha值。 但是,有几个属性可以修改,包括:

●barStyle属性

●半透明的财产

●tintColor属性

(取自Apple: 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/

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

尝试使用 –

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

在viewController中覆盖 – (void)viewWillAppear方法并尝试下面的代码,

 - (void)viewWillAppear { UINavigationBar *navigationBar = [[self navigationController] navigationBar]; CGRect frame = [navigationBar frame]; frame.size.height = 82.0f; [navigationBar setFrame:frame]; } 

sizeThatFits:不再适用于iOS11的UINavigationBar子类。 苹果工程已经证实,这种技术从来没有支持,并与iOS11的变化sizeThatFits:不再咨询。

最简单有效的解决scheme是添加一个类别导航栏。 (但也许不是最好的解决scheme)

 @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使用它的问题

self.navigationController.navigationBar.frame是iOS版本4.x的readonly属性

它会被改变,即使你会看到exception的行为。

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

根据所select的方法,我遇到了很多问题。 在我的具体情况下,导航栏隐藏在整个应用程序,除了在设置视图控制器。 由于我需要指定导航栏的自定义高度并同时显示导航栏,因此源视图控制器和“设置”视图控制器之间的连线具有非常草率的animation。

绝对最好的解决scheme可以在这里find: https : //gist.github.com/maciekish/c2c903d9b7e7b583b4b2 。 我只是将类别导入到设置视图控制器中,并在viewDidLoad调用`self.navigationController.navigationBar'上的setHeight:方法。 看起来很棒!

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

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

如果你想改变其他参数的手段,只需编辑任何一个参数….

试试这个代码里面- (void)viewDidLayoutSubviews方法,

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

创build类别和重写sizeThatFits(_ size:CGSize) – > CGSize方法更改UINavigationBar大小遍布应用程序。 假设你只想在一个特定的ViewController中更改UINavigationBar的高度/大小(在我的情况下)

我就是这么做的

 extension UINavigationBar { open override func sizeThatFits(_ size: CGSize) -> CGSize { let v = self.value(forKey: "frame") as? CGRect return v?.size ?? CGSize(width: UIScreen.main.bounds.width, height: 44) } } 

在调用者ViewController会看起来像

 override func viewDidLoad() { super.viewDidLoad() configureNavigationBar() } private func configureNavigationBar() { var naviBarFrame = self.navigationController?.navigationBar.frame naviBarFrame?.size.height = 74 let rect = naviBarFrame ?? CGRect(x: 0, y: 20, width: UIScreen.main.bounds.width, height: 74) self.navigationController?.navigationBar.setValue(rect, forKey: "frame") }