有人可以告诉我如何更改导航栏高度吗?
这是我到目前为止所拥有的:
CGFloat navBarHeight = 10;
self.navigationController.navigationBar.frame.size.width = navBarHeight;
答案 0 :(得分: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
它非常好用。
答案 1 :(得分:21)
您不应更改导航栏的高度。 来自View Controller的Apple编程指南:
自定义导航栏外观
在导航界面中,导航控制器拥有其UINavigationBar对象并负责管理它。不允许更改导航栏对象或直接修改其边界,框架或Alpha值。但是,有一些属性可以修改,包括以下内容:
●barStyle属性
●半透明属性
●tintColor属性
- UPDATE - IOS 7 ---仍然只能更改可用的属性,但下面是关于如何在导航栏中实现灵活性的精彩教程http://www.appcoda.com/customize-navigation-status-bar-ios-7/
答案 2 :(得分:7)
我已经解决了这个问题,我创建了UINavigationController的子类。在这个MainNavigationViewController.m文件中,我重写了viewDidLayoutSubviews()方法,其中我为self.navigationBar设置了框架
答案 3 :(得分:7)
sizeThatFits:不再适用于iOS11 UINavigationBar子类。 Apple Engineering已经确认这项技术从未受到支持,并且iOS11更改了尺寸,因此不再需要咨询。
答案 4 :(得分:6)
覆盖 - (void)viewController中的viewWillAppear方法并尝试下面的代码,
- (void)viewWillAppear {
UINavigationBar *navigationBar = [[self navigationController] navigationBar];
CGRect frame = [navigationBar frame];
frame.size.height = 82.0f;
[navigationBar setFrame:frame];
}
答案 5 :(得分:5)
尝试使用 -
CGFloat navBarHeight = 10.0f;
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight);
[self.navigationController.navigationBar setFrame:frame];
答案 6 :(得分: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可能会遇到一些问题
答案 7 :(得分:3)
self.navigationController.navigationBar.frame
是iOS版本4.x上的readonly
属性
它会被改变,即使你会看到异常行为。
例如,当应用状态更改为背景并返回前景时,导航栏将显示原始大小的高度
答案 8 :(得分:2)
根据所选择的方法,我遇到了很多问题。在我的特定情况下,导航栏在整个应用程序中隐藏,但在设置视图控制器中除外。由于我需要指定导航栏的自定义高度并同时显示导航栏,因此源视图控制器和设置视图控制器之间的segue有一个非常草率的动画。
绝对最佳解决方案可在此处找到:https://gist.github.com/maciekish/c2c903d9b7e7b583b4b2。我刚刚将类别导入设置视图控制器,并在viewDidLoad
中调用了`self.navigationController.navigationBar'中的setHeight:
方法。看起来很棒!
答案 9 :(得分: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)];
如果你想改变其他参数意味着,只需编辑任何一个参数......
答案 10 :(得分:0)
在 - (void)viewDidLayoutSubviews
方法
CGFloat navBarHeight = 10.0f;
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight);
[self.navigationController.navigationBar setFrame:frame];
答案 11 :(得分: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")
}