UITabBarController简单介绍
一、UITabBarController简介
IOS提供了3中视图切换的方法,除了熟悉的UINavagationController,另一个最常用的方法是使用UITabBarController(选项卡控制器,又叫分页栏控制器),另外一种方法是使用模态窗口,将在后面介绍。
和UInavagationController一样,UITabBarController同样只是一个容器,需要用视图控制器来填充。本文对UITabBarController的介绍是纯代码的,我们还可以使用Interface Building的方式创建以及设置,也是比较方便的,读者可自行尝试。
二、UITabBarController的创建:
与构建导航控制器的方法一样,步骤是:
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
效果展示:
四、UITabBarControllerDelegate代理方法
首先别忘了对自己设置代理:
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(@"退出定制");
}
由于各个代理方法涉及的界面较多,这里就不一一贴出结果了,读者请自行尝试以更好的体会。