IOS提供了3中视图切换的方法,除了熟悉的UINavagationController,另一个最常用的方法是使用UITabBarController(选项卡控制器,又叫分页栏控制器),另外一种方法是使用模态窗口,将在后面介绍。
和UInavagationController一样,UITabBarController同样只是一个容器,需要用视图控制器来填充。本文对UITabBarController的介绍是纯代码的,我们还可以使用Interface Building的方式创建以及设置,也是比较方便的,读者可自行尝试。
与构建导航控制器的方法一样,步骤是:
1、在AppDelegate文件中创建一个窗口;
2、创建一个选项卡控制器(当然前提是创建一个选项卡控制器的类,继承于UITabBarController);
3、将该选项卡控制器实例作为窗口的根视图控制器
代码实例:
@interface AppDelegate () @end @implementationAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { self.window.backgroundColor = [UIColor whiteColor]; self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; TabBarController *tbc = [[TabBarController alloc]init]; self.window.rootViewController = tbc; [self.window makeKeyAndVisible]; return YES; } @end
为了演示的效果更加,我们创建了多个不同的视图控制器。直接来看代码:
#import "TabBarController.h" #import "Test1ViewController.h" #import "Test2ViewController.h" #import "Test3ViewController.h" #import "Test4ViewController.h" #import "Test5ViewController.h" @interface TabBarController ()<UITabBarControllerDelegate> @end @implementationTabBarController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [self loadBaseUI]; } - (void)loadBaseUI { //设置代理 self.delegate = self; /* *这里需要注意的是,如果使用addChildViewController方法将试图控制器一个一个添加到tabBarController中,编译器在编译的时候也是一个一个添加tabBarItem的,如果添加的tabBarItem超过了5个,那么最终显示出来的结果只有5个tabBarItem(实际上是不只五个的)。 如果用另一种方法:将所有要添加的视图控制器先存放在一个数组中,然后将数组赋予self.viewControllers属性,在视图控制器超过5个的情况下,结果就会不一样(第5个tabBarItem显示为更多) */ Test1ViewController *VC1 = [[Test1ViewController alloc]initWithNibName:@"Test1ViewController" bundle:nil]; VC1.view.backgroundColor = [UIColor greenColor]; VC1.tabBarItem.title = @"电话"; VC1.tabBarItem.image = [UIImage imageNamed:@"电话"]; VC1.tabBarItem.selectedImage = [UIImage imageNamed:@"电话高亮"]; VC1.tabBarItem.badgeValue = @"2"; // [self addChildViewController:VC1]; // UINavigationController *navc =[[UINavigationController alloc]initWithRootViewController:VC1]; // [self addChildViewController:navc]; Test2ViewController *VC2 = [[Test2ViewController alloc]init]; VC2.view.backgroundColor = [UIColor orangeColor]; VC2.tabBarItem.title = @"联系人"; VC2.tabBarItem.image = [UIImage imageNamed:@"联系人"]; VC2.tabBarItem.selectedImage = [UIImage imageNamed:@"联系人高亮"]; // [self addChildViewController:VC2]; Test3ViewController *VC3 = [[Test3ViewController alloc]init]; VC3.view.backgroundColor = [UIColor blueColor]; VC3.tabBarItem.title = @"收藏"; VC3.tabBarItem.image = [UIImage imageNamed:@"收藏"]; VC3.tabBarItem.selectedImage = [UIImage imageNamed:@"收藏高亮"]; // [self addChildViewController:VC3]; Test4ViewController *VC4 = [[Test4ViewController alloc]init]; UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem]; btn.backgroundColor = [UIColor greenColor]; btn.frame = CGRectMake(100, 120, 120, 40); [btn setTitle:@"点击" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(clickAction:) forControlEvents:UIControlEventTouchUpInside]; [VC4.view addSubview:btn]; VC4.view.backgroundColor = [UIColor brownColor]; VC4.tabBarItem.title = @"相机"; VC4.tabBarItem.image = [UIImage imageNamed:@"相机"]; VC4.tabBarItem.selectedImage = [UIImage imageNamed:@"相机高亮"]; // [self addChildViewController:VC4]; Test5ViewController *VC5 = [[Test5ViewController alloc]init]; VC5.tabBarItem.title = @"测试"; VC5.tabBarItem.image = [UIImage imageNamed:@"收藏"]; // [self addChildViewController:VC5]; Test5ViewController *VC6 = [[Test5ViewController alloc]init]; VC5.tabBarItem.title = @"测试"; VC5.tabBarItem.image = [UIImage imageNamed:@"收藏"]; // [self addChildViewController:VC6]; Test5ViewController *VC7 = [[Test5ViewController alloc]init]; VC5.tabBarItem.title = @"测试"; VC5.tabBarItem.image = [UIImage imageNamed:@"收藏"]; // [self addChildViewController:VC7]; //设置tabBarController的子视图控制器 NSArray *arr = [NSArray arrayWithObjects:VC1,VC2,VC3,VC4,VC5,VC6,VC7,nil]; self.viewControllers = arr; //该属性在more中的Edit按钮点击后有所体现 self.customizableViewControllers = arr; //设置tabBar风格 self.tabBar.barStyle = UIBarStyleDefault; //设置tabBar的背景颜色 // self.tabBar.barTintColor = [UIColor lightGrayColor]; //注意设置backGroundColor并不是设置tarBar的背景是,而是设置bar底下一层的颜色 self.tabBar.backgroundColor = [UIColor lightGrayColor]; //设置所选中的tabBarItem的主题色(默认为蓝色) self.tabBar.tintColor = [UIColor greenColor]; }
#pragma mark - transformAction - (void)clickAction:(UIButton *)sender { //切换到第一个子视图控制器 //方法1 // self.selectedViewController =[self.viewControllers objectAtIndex:0]; //方法2 self.selectedIndex = 0; } @end
效果展示:
首先别忘了对自己设置代理:
self.delegate = self;
//点击某个tabBarItem的时候调用,返回BOOL值,NO表示无法加载到指定子视图控制器 - (BOOL)tabBarController:(UITabBarController *)tabBarControllershouldSelectViewController:(UIViewController *)viewController { if ([self.viewControllers indexOfObject:viewController] == 1) { NSLog(@"禁止访问"); return NO; } return YES; }
//切换进入到某个子视图控制器的时候调用 - (void)tabBarController:(UITabBarController *)tabBarControllerdidSelectViewController:(UIViewController *)viewController { NSLog(@"Number %dviewController selected",[self.viewControllers indexOfObject:viewController]); }<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
//通过more中的Edit调出定制界面后调用 - (void)tabBarController:(UITabBarController *)tabBarControllerwillBeginCustomizingViewControllers:(NSArray *)viewControllers { NSLog(@"定制分页栏"); }
//定制结束后调用,参数changed表示是否改变了分页栏 - (void)tabBarController:(UITabBarController *)tabBarControllerwillEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed { switch (changed) { case YES: NSLog(@"分页栏重新定制"); break; default: NSLog(@"分页栏未改变"); break; } }
//退出定制的时候调用 - (void)tabBarController:(UITabBarController *)tabBarControllerdidEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed { NSLog(@"退出定制"); }
由于各个代理方法涉及的界面较多,这里就不一一贴出结果了,读者请自行尝试以更好的体会。