彩票03——设置导航条
前面的文章中,
我们已经设置了好了tabBar,现在我们来设置我们的导航条。
一、在 QWMTabBarViewController 中设置导航条
1.1 方法说明与修改
我们知道,我们的根控制器是 QWMTabBarViewController
,在这里面我们创建我们需要tabBar以及对应的控制器。现在我们的五个大的分类控制器中,都有导航条,那么我们需要添加的导航条就在这个类中添加。我们需要添加导航条的方法是
-(void)setupOneChildViewController:(UIViewController *)vc image:(UIImage *)image selImage:(UIImage *)selImage
那么这个方法中,我们需要干些什么呢?
- 由于我们的导航条需要显示我们的标题,所以我们需要标题的文字,那么这个文字哪里来呢?方法传递进来,所以我们修改方法为:
-(void)setupOneChildViewController:(UIViewController *)vc image:(UIImage *)image selImage:(UIImage *)selImage title:(NSString *)title
- 我们需要导航条,那么我们可是使用导航控制器来包装我们的控制。然后设置相应的属性。
//添加一个子控制器
-(void)setupOneChildViewController:(UIViewController *)vc image:(UIImage *)image selImage:(UIImage *)selImage title:(NSString *)title{
// [self addChildViewController:vc];
//设置我们控制器的一些属性
vc.tabBarItem.image = image;
vc.tabBarItem.selectedImage = selImage;
[self.items addObject:vc.tabBarItem];
//添加标题
vc.navigationItem.title = title;
//导航控制器部分----------------------
//设置导航控制器包装我们现在的控制器
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:vc];
//设置导航条的一些属性 背景
[nav.navigationBar setBackgroundImage:[UIImage imageNamed:@"NavBar64"] forBarMetrics:UIBarMetricsDefault];
// 设置字体颜色大小
//创建一个集合
NSMutableDictionary *ditM = [NSMutableDictionary dictionary];
//字体颜色
ditM[NSForegroundColorAttributeName] = [UIColor whiteColor];
//字体大小
ditM[NSFontAttributeName] = [UIFont boldSystemFontOfSize:24];
[nav.navigationBar setTitleTextAttributes:ditM];
[self addChildViewController:nav];
}
1.2 图示
1.3 缺陷与不足
使用现在的这种方式,我们发现,关于导航栏的东西全部放在了 QWMTabBarViewController 中。这与我们的封装思想相违背,所以我们应该把它放到导航栏中去,那么怎么放进去呢,当然是自定义啦。
二、自定义导航控制器 1 —— 在 viewDidLoad 中完成初始化
2.1 方法说明与修改
我们自定义了导航控制器,那么我们需要完成导航条的一些初始化,现在我们把这些初始化,放在 viewDidLoad 中完成
//
// QWMNavigationController.m
// 03_UIView79_彩票
//
// Created by 杞文明 on 17/8/13.
// Copyright © 2017年 杞文明. All rights reserved.
//
#import "QWMNavigationController.h"
@interface QWMNavigationController ()
@end
@implementation QWMNavigationController
- (void)viewDidLoad {
[super viewDidLoad];
//设置背景
[self.navigationBar setBackgroundImage:[UIImage imageNamed:@"NavBar64"] forBarMetrics:UIBarMetricsDefault];
//设置字体颜色
NSMutableDictionary *ditM = [NSMutableDictionary dictionary];
ditM[NSForegroundColorAttributeName] = [UIColor whiteColor];
//大小
ditM[NSFontAttributeName] = [UIFont boldSystemFontOfSize:24];
//设置navigationbar的属性
[self.navigationBar setTitleTextAttributes:ditM];
}
@end
然后我们需要在 QWMTabBarViewController 的 setupOneChildViewController
方法中进行相应的修改 。其次我们这里还创建了两个不同的导航控制器哦。
//添加一个子控制器
-(void)setupOneChildViewController:(UIViewController *)vc image:(UIImage *)image selImage:(UIImage *)selImage title:(NSString *)title{
// [self addChildViewController:vc];
//设置我们控制器的一些属性
vc.tabBarItem.image = image;
vc.tabBarItem.selectedImage = selImage;
[self.items addObject:vc.tabBarItem];
//添加标题
vc.navigationItem.title = title;
//创建自滚一的导航条
UINavigationController *nav;
if([vc isKindOfClass:[QWMArenaViewController class]]){
nav = [[UINavigationController alloc]initWithRootViewController:vc];
}else{
nav = [[QWMNavigationController alloc]initWithRootViewController:vc];
}
[self addChildViewController:nav];
}
2.2 图示
2.3 缺陷与不足
虽然我们进行了封装,实现了类的各司其职。但是我们这里会发现一个事情,我们关于导航条的设置会设置5次。我们希望设置一次就行了,却要设置5次,这下就尴尬了。那么我们接下来就想想办法只设置一次呗。
三、自定义导航控制器 2 —— 在 initialize 中完成初始化
3.1 方法说明与修改
我们只需要设置一次,那么我们可以把这个这些设置放在 initialize
中。那么问题来了,我们如何获取我们的 NavigationBar呢,其实我们可以通过标识来获取 NavigationBar 。
所以我哦们的方法修改如下
//
// QWMNavigationController.m
// 03_UIView79_彩票
//
// Created by 杞文明 on 17/8/13.
// Copyright © 2017年 杞文明. All rights reserved.
//
#import "QWMNavigationController.h"
@interface QWMNavigationController ()
@end
@implementation QWMNavigationController
// 什么时候调用 当第一次初始这个类的时候调用
// 作用 初始化这个类
+ (void)initialize{
//获取导航栏标识
//appearance 是一个协议, 只要遵守了这协议都有这方法
//使用这个方法会产生的bug,它会统一定制我们的导航条,所有的导航条都是一样的,无法实现我们上面一步中实现的效果,因此,我们不能使用这个方法
//UINavigationBar *bar = [UINavigationBar appearance];
//获取某几个类的导航条标识 ,只修改我们设置的这几个导航条类的导航条
UINavigationBar *bar = [UINavigationBar appearanceWhenContainedIn:[QWMNavigationController class], nil];
//设置背景
[bar setBackgroundImage:[UIImage imageNamed:@"NavBar64"] forBarMetrics:UIBarMetricsDefault];
//设置字体颜色
NSMutableDictionary *ditM = [NSMutableDictionary dictionary];
ditM[NSForegroundColorAttributeName] = [UIColor whiteColor];
//大小
ditM[NSFontAttributeName] = [UIFont boldSystemFontOfSize:24];
//设置navigationbar的属性
[bar setTitleTextAttributes:ditM];
}
@end