nav与tabbar混合使用,这种节目应用范围很广的,比如网易云音乐的首页节目:
既有底部的tabbar又有导航栏,而且各个导航栏界面相互独立。
这个界面实现起来也不算复杂,下面就介绍一种通用的写法:
在AppDelegate.m中:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
HomeViewController *home = [[HomeViewController alloc] init];
UINavigationController *homeNav = [[UINavigationController alloc] initWithRootViewController:home];
home.title = @"首页";
home.view.backgroundColor = [UIColor orangeColor];
MusicViewController *music = [[MusicViewController alloc] init];
UINavigationController *musicNav = [[UINavigationController alloc] initWithRootViewController:music];
music.title = @"音乐";
music.view.backgroundColor = [UIColor grayColor];
SettingViewController *setting = [[SettingViewController alloc] init];
UINavigationController *settingNav = [[UINavigationController alloc] initWithRootViewController:setting];
setting.title = @"设置";
setting.view.backgroundColor = [UIColor purpleColor];
NSArray *array = [NSArray arrayWithObjects:homeNav,musicNav,settingNav, nil];
UITabBarController *tabar = [[UITabBarController alloc] init];
tabar.viewControllers = array;
self.window.rootViewController = tabar;
[self.window makeKeyAndVisible];
return YES;
}
这段代码都是基础代码,就不过多注释了,简单说下,就是有创建几个视图,然后每一个都嵌入一个Nav控制器,然后把Nav控制器放到tabbar控制器中就可以了。
下面讲一个细节问题,就是当导航栏控制器推下一个视图的时候,如果不处理tabbarItem的话,底部就会一直出现(如下图所示)
这显然不符合要求,那么简单的方法有一个,两行代码可以搞定:
/**************隐藏与现实bar******************/
- (void)viewDidAppear:(BOOL)animated{
self.hidesBottomBarWhenPushed = YES;
}
-(void)viewDidDisappear:(BOOL)animated {
self.hidesBottomBarWhenPushed = NO;
}
/*******************************************/
添加代码后效果如下:
不过在开发过程中,tabbar的子视图都需要用到这些代码,所以可以把这个代码放到一个BaseVC中,然后子视图都继承这个VC就可以了,这样可以节约代码量也方便后期维护。