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

时间:2015-08-14 09:07:01

标签: ios swift uinavigationcontroller uinavigationbar

我想制作一个更高的导航栏,我想尝试使用UINavigationBar的子类。

这是我的UINavigationBar的子类:

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

在嵌入导航控制器的ViewController中,我在viewDidLoad()函数中编写以下代码

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

没有报告错误,但是在运行代码时我什么都没得到。一个完全空白的视图。 enter image description here

有什么建议吗?或者其他一些改变高度的方法?感谢。

2 个答案:

答案 0 :(得分:8)

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
    }
}

我不急于做,但答案很简单,这是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中的所有内容(包括导航控制器和tabbarcontrollers)子类化并调整大小,为了强制所有导航控制器使用此导航栏,您必须子类化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]];

这将成功将您的导航控制器强制转换为自定义导航栏,如果您想从此处更改导航栏的高度,那么您可以执行以下操作:

答案 1 :(得分:8)

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

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

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

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

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