以编程方式更改导航栏的高度

我想做一个更高的导航栏,我正在尝试使用UINavigationBar的子类来做到这一点。

这是我的UINavigationBar的子类:

import UIKit class TallerNaviBar: UINavigationBar { override func sizeThatFits(size: CGSize) -> CGSize { var newSize:CGSize = CGSizeMake(size.width, 87) return newSize } } 

而在我的ViewController里面embedded了一个导航控制器,我在viewDidLoad()函数中写了下面的代码

 self.navigationController!.setValue(TallerNaviBar(frame: CGRectMake(0, 0, self.view.frame.size.width, 87)), forKeyPath: "navigationBar") 

没有错误报告,但是当我运行代码时什么也没有得到。 一个完全空白的视图。 在这里输入图像说明

任何build议? 或者改变身高的其他方法? 谢谢。

 class TallerNaviBar: UINavigationBar { override func sizeThatFits(size: CGSize) -> CGSize { var newSize:CGSize = CGSizeMake(self.superview!.frame.size.width, 87) return newSize } } 

我不做快,但答案很简单,这是ObjC

 - (CGSize)sizeThatFits:(CGSize)size { return CGSizeMake([self superview].frame.size.width, 40); } 

这是我在Swift中的解释:

 import UIKit class TallerNaviBar: UINavigationBar { override func sizeThatFits(size: CGSize) -> CGSize { var newSize:CGSize = CGSizeMake(superview.width, 87) return newSize } } 

你将遇到的问题不是用这种方法,这是简单的部分,问题是迫使导航控制器总是使用这个导航栏

我的子类和resize的一切都在IOS,包括导航控制器和tabbarcontrollers,为了强制所有的导航控制器使用这个导航栏,你必须inheritance一个navigationController,并且只在你的应用程序中使用这个导航控制器,这是子类是如何工作的,这是Obj C,所以你必须翻译它:

 @interface NSHNavigationController () <UINavigationBarDelegate, UINavigationControllerDelegate> { } @implementation NSHNavigationController #pragma mark Initialization - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { [self NSHSetupNavigationController]; } return self; } - (instancetype)initWithNavigationBarClass:(Class)navigationBarClass toolbarClass:(Class)toolbarClass { self = [super initWithNavigationBarClass:navigationBarClass toolbarClass:toolbarClass]; if (self) { [self NSHSetupNavigationController]; } return self; } - (id)initWithRootViewController:(UIViewController *)rootViewController { self = [super initWithRootViewController:rootViewController]; if (self) { [self NSHSetupNavigationController]; } return self; } - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { [self NSHSetupNavigationController]; } return self; } - (void)dealloc { [self setInternalDelegate:nil]; [self setExternalDelegate:nil]; } #pragma mark Setup - (void)NSHSetupNavigationController { [self setValue:[[NSHNavigationBar alloc]init] forKeyPath:@"navigationBar"]; } 

这是将为你做的线:

  [self setValue:[[NSHNavigationBar alloc]init] forKeyPath:@"navigationBar"]; 

哦,是的,并确保你是inheritance导航栏,你说你是,但这是你如何做到这一点,很简单:

 #import "NSHNavigationBar.h" @implementation NSHNavigationBar - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { NSDictionary *attributes = @{NSForegroundColorAttributeName:[UIColor whiteColor], NSFontAttributeName:fontMagicForRegularNSHFont}; [self setTitleTextAttributes:attributes]; [self setTranslucent:true]; [self setBackgroundColor:[UIColor clearColor]]; } return self; } - (CGSize)sizeThatFits:(CGSize)size { return CGSizeMake([self superview].frame.size.width, heightResizer(40)); } - (void)layoutSubviews { [super layoutSubviews]; } 

所以,总结一下,UINavigationBar和UINavigationController的子类都是你设置的,这样可以让你随心所欲地操纵导航条,也可以键入你的视图控制器的导航条,这是一个小小的问题,并且会迷惑了很多人,但这里却是这样:

 -(CustomNavigationBar *)navBar { return (id)[self.navigationController navigationBar]; } 

把上面的东西放在你的视图控制器中,然后你这样调用它:

 [[self navBar] setBackGroundColor:[UIColor blueColor]]; 

这将成功地将您的navigationcontroller转换为您的自定义导航栏,如果您想从这里更改导航栏的高度,则可以这样做:

这是一个简单的基于最小子类的Swift 3解决scheme。 第一个子类UINavigationBar:

 class CustomNavigationBar: UINavigationBar { override func sizeThatFits(_ size: CGSize) -> CGSize { let newSize :CGSize = CGSize(width: self.frame.size.width, height: 54) return newSize } } 

在代码中创build导航控制器,并使用带自定义导航栏类​​的初始化程序。

 let nav = UINavigationController(navigationBarClass: CustomNavigationBar.self, toolbarClass: nil) 

UINavigationBar的所有现有行为将被保留,并且您的自定义高度被采用。