iOS 11及以上版本的更新
苹果不希望你更改导航栏高度,所以请不要触碰它。
请参考以下链接:
https://openradar.appspot.com/32912789
和
https://forums.developer.apple.com/thread/88202#274620
class TallerNaviBar: UINavigationBar {
override func sizeThatFits(size: CGSize) -> CGSize {
var newSize:CGSize = CGSizeMake(self.superview!.frame.size.width, 87)
return newSize
}
}
我不会Swift,但答案很简单,这里是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
}
}
你将面临的问题不是这个方法,这是容易的一部分,问题在于强制导航控制器始终使用此导航栏。
我会对IOS中的所有内容进行子类化和调整大小,包括导航控制器和选项卡控制器。为了强制所有导航控制器都使用此导航栏,您必须子类化一个navigationController,并且仅在整个应用程序中使用此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"]
噢,对了,请确保你正在子类化导航栏,你说你正在做,但这是如何实现的,很简单:
#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]]
如果您希望将导航控制器转换为自定义导航栏,可以成功地进行类型转换。如果您想从这里更改导航栏的高度,则可以执行以下操作: