行业动态
为什么能修改所有导航栏的背景色?查看UINavigationBar发送的消息
2021-03-15

一、 UINavigationBar结构

导航栏是几乎每个页面都会遇到的问题。通常有两种处理方式:1.隐藏而不显示2.自定义

1.添加导航栏

TestViewController * mainVC = [[TestViewController alloc] init];
UINavigationController * nav = [[UINavigationController alloc] initWithRootViewController:mainVC];
    self.window.rootViewController = nav;

2.隐藏导航栏

在TestViewController.m文件中,使用以下代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self.navigationController setNavigationBarHidden:YES];
    //self.navigationController.navigationBar.hidden = YES;
}

注意:可以直接成功设置属性的原因是,尽管navigationBar是只读的,但默认设置是hidden(读写)。建议使用第一个,它是通过发送消息来设置的。

3.修改导航栏的背景颜色

由于系统的内置导航栏不再能满足用户的审美需求,因此导航栏在开发过程中已或多或少地进行了自定义;即使仅修改背景色或字体颜色。

[[UINavigationBar appearance] setBarTintColor:[UIColor redColor]];

效果图片

说明:为什么所有导航栏的背景色都可以修改?

检查UINavigationBar发送的消息的外观,UINavigationBar是一个称为UIAppearance的协议。根据官方网站的解释:UIAppearance是一种外观协议(装饰模式)。如果要更改外观,则需要实现此协议,因此UINavigationBar必须在内部实现此协议。头文件中的UIAppearance协议中有4种方法,但是根据官方网站文档,IOS 9之后已放弃了两种方法。因此,只有以下两个可用,并且都返回该类的对象,因此您可以发送消息以修改此类的外观。例如:setBarTintColor。实际上,您可以在获取对象后任意修改它。

+ (instancetype)appearance;
+ (instancetype)appearanceForTraitCollection:(UITraitCollection *)trait

在TestViewController.m文件中,使用以下代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    // 无效果
    self.navigationController.navigationBar.backgroundColor = [UIColor redColor];
    // 可行
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"nav.png"] forBarMetrics:UIBarMetricsDefault];
}

说明:

为什么下面的代码无效,请实际看一下结构图以了解。

self.navigationController.navigationBar.backgroundColor = [UIColor redColor];


393701618