22

有人可以告诉我如何更改导航栏的高度吗?

这是我到目前为止所拥有的:

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

12 回答 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

它工作得很好。

于 2012-01-17T12:35:11.717 回答
21

您不应更改导航栏的高度。来自 Apple Programming Guide on View Controller:

自定义导航栏外观

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

● barStyle 属性

● 透光性

● 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/

于 2011-09-23T18:07:44.617 回答
8

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

于 2014-09-26T08:05:46.710 回答
8

sizeThatFits:不再适用于 iOS11 UINavigationBar 子类。Apple Engineering 已确认该技术从未受到支持,并且随着 iOS11 的更改 sizeThatFits: 不再被咨询。

于 2017-06-30T23:56:45.070 回答
6

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

- (void)viewWillAppear {

UINavigationBar *navigationBar = [[self navigationController] navigationBar];
CGRect frame = [navigationBar frame];
frame.size.height = 82.0f;
[navigationBar setFrame:frame];
}
于 2012-12-04T07:30:00.783 回答
5

尝试使用 -

CGFloat navBarHeight = 10.0f;    
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight);
[self.navigationController.navigationBar setFrame:frame];
于 2009-07-24T04:49:48.547 回答
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 可能会遇到一些问题

于 2015-06-25T15:45:25.077 回答
3

self.navigationController.navigationBar.framereadonlyiOS 版本 4.x 上的属性

它会被改变,即使你会看到异常行为。

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

于 2011-08-11T01:53:46.420 回答
2

根据选择的方法,我遇到了很多问题。在我的具体情况下,导航栏隐藏在整个应用程序中,但设置视图控制器中除外。由于我需要指定导航栏的自定义高度并同时显示导航栏,源视图控制器和设置视图控制器之间的segue 有一个非常草率的动画。

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

于 2015-08-31T21:21:20.437 回答
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)];

如果您想更改其他参数意味着,只需编辑任何一个参数....

于 2015-11-07T07:44:14.163 回答
0

创建类别并覆盖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")
}
于 2017-03-03T14:55:37.183 回答
0

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

CGFloat navBarHeight = 10.0f;    
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight);
[self.navigationController.navigationBar setFrame:frame];
于 2016-05-10T10:57:23.467 回答