iOS每个ViewController一个NavigationBar

iOS每个ViewController一个NavigationBar

在日常开发中,我们经常会碰到一些关于导航栏的问题,例如视觉设计,经常性的改变NavigationBar的风格,虽然我们能够在viewwillApper中来进行处理,但是总是太麻烦,而且需要写很多多余的代码,今天就来讲讲这种效果,其实已经有很多APP都是使用这种效果

我们先来看看已经有的一些APP使用的这种效果

这是天猫APP的效果,注意观察他的导航栏

这是网易新闻,注意看导航栏

越来越多的APP采用这种样式来控制导航栏的不同风格,今天我们就来实现这一效果。

这里需要使用到一个第三方库

https://github.com/rickytan/RTRootNavigationController

借助这个库我们能够轻松实现这一效果

新建一个工程,这里我们使用cocoapods来集成这个第三方库

集成RTRootNavigationController

podfile


1

2

3

4

5

6

workspace ‘iOS每个VC单独的一个导航栏.xcworkspace’

project ‘iOS每个VC单独的一个导航栏.xcodeproj’

platform :ios, ‘8.0‘

target ‘iOS每个VC单独的一个导航栏‘ do

pod ‘RTRootNavigationController’

end

使用RTRootNavigationController当做当前的rootController

创建BaseViewController

我这里新建一个BaseViewController 主要是为了引入RTRootNavigationController,当然如果是OC项目的话,可以直接创建一个PCH文件,直接全局引用也行,不过我们一般都会有一个基类的ViewController,在这个基类中,没有做任何操作,只是引用了一个RTRootNavigationController


1

2

3

4

5

#import "RTRootNavigationController.h"

@interface BaseViewController : UIViewController

@end

设置根控制器

在Appdelegate中,我们需要将我们的window的rootcontroller设置为RTRootNavigationController


1

2

3

4

5

6

7

8

9

10

11

12

13

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

ViewController *viewController = [[ViewController alloc] init];

RTRootNavigationController *rootViewController1 = [[RTRootNavigationController alloc] initWithRootViewController:viewController];

_window.rootViewController = rootViewController1;

_window.backgroundColor = [UIColor whiteColor];

[_window makeKeyAndVisible];

return YES;

在ViewController中,我们需要push出去一个vc的时候,我们需要这样实现


1

2

//注意这里push的时候需要使用rt_navigation push出去

[self.rt_navigationController pushViewController:vc1 animated:YES complete:nil];

看一下效果

设置返回NavigationBar按钮

在当前的vc中,我们设置返回按钮,或者其他的按钮,也很方便


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

 UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeCustom];

[btn1 addTarget:self action:@selector(leftBar1Clicked) forControlEvents:UIControlEventTouchUpInside];

[btn1 setTitle:@"返回1" forState:UIControlStateNormal];

[btn1 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

[btn1 sizeToFit];

UIBarButtonItem *item1 = [[UIBarButtonItem alloc] initWithCustomView:btn1];

UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeCustom];

[btn2 setTitle:@"返回2" forState:UIControlStateNormal];

[btn2 setTitleColor:[UIColor redColor] forState:UIControlStateNormal];

[btn2 addTarget:self action:@selector(leftBar2Clicked) forControlEvents:UIControlEventTouchUpInside];

[btn2 sizeToFit];

UIBarButtonItem *item2 = [[UIBarButtonItem alloc] initWithCustomView:btn2];

self.navigationItem.leftBarButtonItems = @[item1,item2];

UIButton *btn3 = [UIButton buttonWithType:UIButtonTypeCustom];

[btn3 setTitle:@"右键" forState:UIControlStateNormal];

[btn3 setTitleColor:[UIColor redColor] forState:UIControlStateNormal];

[btn3 addTarget:self action:@selector(rightBarClicked) forControlEvents:UIControlEventTouchUpInside];

[btn3 sizeToFit];

UIBarButtonItem *rightItem = [[UIBarButtonItem alloc] initWithCustomView:btn3];

self.navigationItem.rightBarButtonItem = rightItem;

[self.view addSubview:label];

多个按钮定义也是很方便的

如果只是需要一个左边的返回按钮,这个按钮需要自定义样式,那么可以直接在当前VC冲下方法


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

/**

 如果对于返回事件不需要做任何处理,

 但是有想要自定义返回按钮的样式,

 可以直接重写这个方法

 @param target 监听对象

 @param action 返回事件

 @return 自定义的返回按钮

 */

-(UIBarButtonItem *)customBackItemWithTarget:(id)target action:(SEL)action{

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

    [btn setTitle:@"返回" forState:UIControlStateNormal];

    [btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];

    [btn sizeToFit];

    [btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:btn];

    return item;

}

这样的话,就不要去单独设置左上角的返回按钮了

跳到最开始的VC

在我们pop的时候,可以直接pop在栈顶的VC


1

[self.rt_navigationController popToRootViewControllerAnimated:YES complete:nil];

push到另外一个VC 销毁当前的VC

有时我们想要实现这样一种效果,当当前的VCpush出去过后,希望销毁当前的VC


1

2

3

4

ViewController4 *vc4 = [[ViewController4 alloc] init];

[self.rt_navigationController pushViewController:vc4 animated:vc4 complete:^(BOOL finished) {

     [self.rt_navigationController removeViewController:self];

 }];

更改导航栏颜色

之前忘记更改导航栏的颜色了,这里看一下,更改导航栏的颜色,只需要


1

self.navigationController.navigationBar.barTintColor = [UIColor greenColor];

总结

如果你的APP在导航栏有多种样式的话,你完全可以使用这种方法,使用起来很方便

感谢:

rickyTan开源

https://github.com/rickytan/RTRootNavigationController

项目的源码我放在了:

https://github.com/yangqian111/blog/tree/master/iOS每个VC单独的一个导航栏

时间: 2024-08-14 20:28:46

iOS每个ViewController一个NavigationBar的相关文章

(Android+IOS)正在做一个新闻App,做的差不多了,听听大家的建议 (图)

(Android+IOS)正在做一个新闻App,做的差不多了,听听大家的建议! 新闻采集器做好了,前端展示APP界面感觉还不是很好,还需要改进改进,希望发布(Android和IOS版本)前听听大家的建议! 新闻采集器做好了,前端展示APP界面感觉还不是很好,还需要改进改进,希望发布前听听大家的建议!

快速掌握iOS API的一个小技巧

快速掌握iOS API的一个小技巧 周银辉 iOS SDK和Developer Library中提供了各个类以及函数的帮助文档,这很棒,但要想了解整个库的大体结构(比如UIKit下有哪些类,他们的继承关系如何)这有些让人摸不着头脑,下面有个小技巧: 打开iOS Developer Library, 点击你想要了解的Framework,以UIKit为例,好多东西都是平级地放在一起的,根本看不下去了 然后在搜索框输入: Framework Reference,绝大多数情况下都会出现一个 xxx Fr

IOS某个ViewController禁止自动旋转

IOS屏幕自动旋转,强制横竖屏方法: - (BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientations { return (UIInterfaceOrientationMaskAll);// 修改这里 控制显示方向 } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrienta

iOS Dev (66) 一个手机游戏程序的基本考虑

iOS Dev (66) 一个手机游戏程序的基本考虑 博客:http://blog.csdn.net/prevention 作者:大锐哥 摘自:Learn iPhone and iPad cocos2d Game Development 1 基本流程内的 handler 程序启动 applicationDidFinishLaunching 程序切到后台 applicationDidEnterBackground 程序运行结束 applicationWillTerminate 2 基本设置 允许用

ios如果写一个提示带动画的View,可以来引导用户行为

先上图: 这个UIView可以这样写: -(id)initWithFrame:(CGRect)frame backImage:(UIImage*)image msgStr:(NSString*)txt txtColor:(UIColor*)color{ self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor clearColor]; _paopaoImage = image; _txt = t

iOS 手动做一个自动打包部署神器

之前使用的fastlane添加pgyer自动打包的,最近发现更新总是有问题,所以产生了自己shell做一个的想法.虽然代码比较少,但是很实用. 打包 导出ipa 上传pgyer 打包自动上传pgyer 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

iOS 在某一个ViewController跳转到TabViewController中的某一个ViewController

要做到这个分为两步 第一步, 导入app #import "AppDelegate.h" 第二步, 监听方法中先写加入以下代码: [self dismissViewControllerAnimated:YES completion:^{ // 这是从一个模态出来的页面跳到tabbar的某一个页面 AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; UITabBar

在iOS上present一个半透明的viewController

UIViewController *viewController = [[UIViewController alloc]init]; UIViewController* controller = self.view.window.rootViewController;viewController.view.backgroundColor = [UIColor blackColor]; viewController.view.alpha = 0.5f; controller.modalPresen

iOS 模拟出一个半透明的ViewController presentViewController 实现

最近项目有需求, 需要模态初一个半透明的视图, 好多人都碰到这个问题吧, 在目标视图中设置背景颜色然后发现模态动作结束后变成了黑色或者不是半透明的颜色. 所以今天来告诉大家解决方案 - (IBAction)Avtion1:(id)sender { TestViewController * testVC = [TestViewController new]; self.definesPresentationContext = YES; //self is presenting view contr