知識(shí)的星空.jpg
上篇中,我們提到的自定義的tabbar
,隨之而來的就是自定義導(dǎo)航控制器UINavigationController
.
- 一般在開發(fā)APP中,我們是把
UITabBarController
和UINavigationController
結(jié)合起來用的.上一篇中我們提到如何自定義tabbar
用KVC來自定義Tabbar,這篇我們來簡(jiǎn)單談?wù)勅绻远x導(dǎo)航控制器.方法也很簡(jiǎn)單,我們直接上代碼.
1.如果想讓UIViewController
擁有push
和pop
的能力,那么就必須給這個(gè)控制器的根視圖設(shè)置為導(dǎo)航控制器
UIViewController *vc = [[UIViewController alloc]init];
UINavigationController *navVC = [[UINavigationController alloc]initWithRootViewController:vc];
這樣的話,這個(gè)控制器就有了導(dǎo)航控制器的能力了.
2.結(jié)合UITabBarController
來設(shè)置.(這段代碼是給tabbar設(shè)置子控制器的代碼,如果不明白請(qǐng)看用KVC來自定義Tabbar)
-(void)setupChildVc:(UIViewController *)vc title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage{
//設(shè)置文字和圖片
vc.tabBarItem.title = title;
vc.tabBarItem.image = [UIImage imageNamed:image];
vc.tabBarItem.selectedImage = [UIImage imageNamed:selectedImage];
vc.view.backgroundColor = [UIColor colorWithRed:arc4random_uniform(100)/100.0 green:arc4random_uniform(100)/100.0 blue:arc4random_uniform(100)/100.0 alpha:1.0];
//設(shè)置為導(dǎo)航控制器,但是這里的是系統(tǒng)的
UINavigationController *navVc = [[UINavigationController alloc]initWithRootViewController:vc];
[self addChildViewController:navVc];
}
3.如果我們要用自己的,就要?jiǎng)?chuàng)建一個(gè)繼承于UINavigationController
的控制器,下面我們簡(jiǎn)稱XTNavigationController
,在XTNavigationController.m
中我來攔截頁面的push
.
-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{
if (self.childViewControllers.count > 0) {
//這里是設(shè)置了一個(gè)返回按鈕,效果圖如下
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setTitle:@"返回" forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"navigationButtonReturn"] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"navigationButtonReturnClick"] forState:UIControlStateHighlighted];
button.size = CGSizeMake(70, 30);
//讓按鈕內(nèi)部的所有內(nèi)容左對(duì)齊
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
//讓按鈕的內(nèi)容往左偏移10
button.contentEdgeInsets = UIEdgeInsetsMake(0, -10, 0, 0);
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
[button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
// 修改導(dǎo)航欄左邊的item
viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
// 隱藏tabbar
viewController.hidesBottomBarWhenPushed = YES;
}
//這句super的push要放在后面, 讓viewController可以覆蓋上面設(shè)置的leftBarButtonItem
[super pushViewController:viewController animated:animated];
}
-(void)back{
[self popViewControllerAnimated:YES];
}
自定義的返回按鈕.png
4.這樣的話側(cè)滑返回的手勢(shì)就沒了,咱們還需要開啟
-(void)viewDidLoad {
[super viewDidLoad];
//設(shè)置導(dǎo)航條的圖片
[self.navigationBar setBackgroundImage:[UIImage imageNamed:@"navigationbarBackgroundWhite"] forBarMetrics:UIBarMetricsDefault];
// 如果滑動(dòng)移除控制器的功能失效蜡饵,清空代理(讓導(dǎo)航控制器重新設(shè)置這個(gè)功能)
self.interactivePopGestureRecognizer.delegate = nil;
}
- 這樣的話,無論我們?cè)谀睦稂c(diǎn)擊
push
進(jìn)去的頁面,tabbar
都是隱藏的,這樣就對(duì)我們開發(fā)過程中是及其重要省力的,歡迎大家嘗試!!! -
這個(gè)就是我們來自定義這個(gè)導(dǎo)航條,還是用的原生的來做.
-
如有錯(cuò)誤,歡迎雅正