1.基本概念
//1.创建视图控制器(视图控制器,导航控制器)的对象
FirstViewController *vc0 = [[FirstViewController alloc]init];
//设置title和image
//视图控制器的title属性可以同时设置tabBarItem的title和navigationItem的title
vc0.title = @"vc0";
// vc0.tabBarItem.title = @"vc0";
// vc0.navigationItem.title = @"vc0";
//tabBarController的标签一般不超过5个。超过5个的话,从第五个开始的剩余的视图控制器会被放到系统自动创建的moreViewController里面,由moreViewController来进行管理。moreNavigationController没有下标
UINavigationController *navC0 = [[UINavigationController alloc]initWithRootViewController:vc0];
//在vc4上添加系统样式的标签元素
//tabBar上放的必须是UITabBarItem类型的
//1.创建系统风格的UITabBarItem:不能修改vc4.tabBarItem.title和vc4.tabBarItem.image --> 修改不起作用
UITabBarItem *item40 = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemFavorites tag:100];
// //2.同时设置title/image/selectedImage
UITabBarItem *item41 = [[UITabBarItem alloc]initWithTitle:@"vc4" image:[UIImage imageNamed:@"tab_s"] selectedImage:nil];
// //3.同时设置title/image/tag
UITabBarItem *item42 = [[UITabBarItem alloc]initWithTitle:@"vc4" image:[UIImage imageNamed:@"tab_s"] tag:100];
//
vc4.tabBarItem = item40;
//2.把要添加的视图控制器的对象放到一个数组中
NSArray *arr = @[navC0,navC1,vc2,vc3,vc4];
//UITabBarController:继承自UIViewController,本质上还是视图控制器。标签栏控制器。
//用来管理视图控制器的软件结构级的组件。UITabBarController里面存放的视图控制器都是并列关系,互不影响。
//3.把数组中的视图控制器的对象添加到tabBarController中
UITabBarController *tabBarC = [[UITabBarController alloc]init];
//数组中存放的必须是普通视图控制器或导航控制器的对象的地址
tabBarC.delegate = self;
tabBarC.viewControllers = arr;
//设置默认选中项 --> 默认选中的是第0个
tabBarC.selectedIndex = 0;
//从NSUserDefaults中获取存储的index
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
NSInteger index = [ud integerForKey:@"selectedIndex"];
tabBarC.selectedIndex = index;
//4.把tabBarC设置为window的根视图控制器
self.window.rootViewController = tabBarC;
[tabBarC release];
2.UITabBarControllerDelegate协议
-(void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed{
NSLog(@"编辑结束");
}
-(void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers{
NSLog(@"即将开始编辑");
}
-(void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed{
NSLog(@"即将结束编辑");
}
-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{
//selectedIndex:选中的视图控制器的下标
NSLog(@"选中的控制器是:%d",tabBarController.selectedIndex);
//把选中的视图控制器的index做永久性存储,下次重新进入程序时,设置tabBarController的默认选中项为存储的index选项
//1.获取NSUserDefaults的对象
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
//2.存数据
[ud setInteger:tabBarController.selectedIndex forKey:@"selectedIndex"];
//3.同步磁盘
[ud synchronize];
}
-(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{
//是否允许选择某个视图控制器 -->
//如果选中的是第二个下标对应的视图控制器 --> 不允许选择
static int cnt = 0;
cnt++;
if (cnt%2 == 0) {
if (tabBarController.selectedIndex == 2) {
return NO;
}
return YES;
}
return YES;
}
3.lzx的
#if 0 //第一种方法 获取保存的索引
//获取本地保存的标签索引
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
NSInteger index = [ud integerForKey:@"selectIndex"];
//moreNavigationController 不在tabBarController的子视图控制器数组
if (index > tab.viewControllers.count-1) {
//指定选中的视图控制器
tab.selectedViewController = tab.moreNavigationController;
}else{
tab.selectedIndex = index;
}
#else//第二种方法 获取保存的标签的标题
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
NSString *title = [ud objectForKey:@"selectTitle"];
NSInteger cnt = 0;
//遍历tabBarController的数组
for (UIViewController *vc in tab.viewControllers) {
//判断是否是选中的标题
if ([title isEqualToString:vc.tabBarItem.title]) {
//指定保存的标签对应的视图控制器
tab.selectedViewController = vc;
break;//找到就跳出
}
cnt++;
if (cnt == tab.viewControllers.count) {
//说明没有找到指定的 那么应该选中的是more
tab.selectedViewController = tab.moreNavigationController;
}
}
#endif
#pragma mark -UITabBarController 协议
//将要选中标签的时候调用
//是否可以选中指定的标签 将要选中 还没有选中
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
if ([viewController.tabBarItem.title isEqualToString:@"second"]) {
//如果标签标题是second 那么不能选中
return NO;
}
return YES;
}
//已经选中标签 之后调用
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
#if 1//第二种方法 已经选中之后保存标签的标题
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
//保存标签标签
[ud setObject:viewController.tabBarItem.title forKey:@"selectTitle"];
[ud synchronize];
#else//第一种 已经选中之后保存 已经选中的标签的索引
/*
tabBarController.selectedIndex这个值 已经选中才会修改
*/
NSLog(@"selectedIndex:%d",tabBarController.selectedIndex);
//这时可以把已经选中的标签索引 进行本地数据持久化存储
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
//本地保存 选中的标签索引
[ud setInteger:tabBarController.selectedIndex forKey:@"selectIndex"];
[ud synchronize];
#endif
}
4.自定义tabBar(system&custom)
/*
如果 tabBar 是一个不规则的 或者 没有在底部 那么这时候我们可以定制一下tabBar
自己实现一个tabBar 替换掉 系统的
1.隐藏系统的tabBar
2.用UIView + UIButton +UILabel
或者用UIImageView + UIButton +UILabel 组合
//如何 控制子视图切换
通过点击button 修改 tabBarController的selectedIndex 或者selectedViewController 就可以切换子视图控制器界面
*/
其实自定制的tabBar可以设置在上面,只要UIView或者UIImageView设置好就行了
-(void)createViewControllers{
//1.读plist文件
NSString *path = [[NSBundle mainBundle] pathForResource:@"CustomTabBarList" ofType:@"plist"];
NSArray *plistArr = [NSArray arrayWithContentsOfFile:path];
NSMutableArray *vcArr = [[NSMutableArray alloc]init];
for (int i = 0; i < [plistArr count]; i++) {
NSDictionary *dict = plistArr[i];
//2.获取视图控制器的名字
NSString *name = [dict objectForKey:@"viewController"];
//3.创建视图控制器的对象
Class cl = NSClassFromString(name);
UIViewController *vc = [(UIViewController *)[cl alloc] init];
[vcArr addObject:vc];
[vc release];
}
self.viewControllers = vcArr;
[vcArr release];
//4.隐藏系统的tabBar
self.tabBar.hidden = YES;
[self customTabBar];
}
#pragma mark - customTabBar
-(void)customTabBar{
//tabBar:默认高度是49
//UIView也可以
UIImageView *bgIv = [[UIImageView alloc]initWithFrame:CGRectMake(0, self.view.frame.size.height - 49, self.view.frame.size.width, 49)];
bgIv.tag = 200;
//手动打开用户交互
bgIv.userInteractionEnabled = YES;
bgIv.image = [UIImage imageNamed:@"tabbg"];
[self.view addSubview:bgIv];
[bgIv release];
for (int i = 0; i < 4; i++) {
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(25 + 80*i, 9, 30, 30);
[btn setImage:[UIImage imageNamed:[NSString stringWithFormat:@"tab_%d",i]] forState:UIControlStateNormal];
[btn setImage:[UIImage imageNamed:[NSString stringWithFormat:@"tab_c%d",i]] forState:UIControlStateSelected];
[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
btn.tag = 100 + i;
[bgIv addSubview:btn];
if (i == 0) {
//设置默认选中的是第0个
btn.selected = YES;
self.selectedIndex = 0;
//添加一个label
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(25, 44, 30, 1)];
label.backgroundColor = [UIColor orangeColor];
label.tag = 300;
[bgIv addSubview:label];
[label release];
}
}
}
-(void)btnClick:(UIButton *)btn{
//先获取到btn所在的视图
UIImageView *tmpIv = (UIImageView *)[self.view viewWithTag:200];
//先把所有按钮的selected置为NO
/*第一种
for (int i = 0; i < 4; i++) {
UIButton *tmpBtn = (UIButton *)[tmpIv viewWithTag:100 + i];
tmpBtn.selected = NO;
}
*/
//第二种:tmpIv上只有label和btn
NSArray *subArr = tmpIv.subviews;
for (int i = 0; i < [subArr count]; i++) {
id obj = [subArr objectAtIndex:i];
if ([obj isKindOfClass:[UIButton class]]) {
UIButton *btn = (UIButton *)obj;
btn.selected = NO;
}
}
//把选中的按钮的selected置为YES
btn.selected = YES;
//设置tabBarController的选中index
self.selectedIndex = btn.tag - 100;
UILabel *tmpLabel = (UILabel *)[tmpIv viewWithTag:300];
//改变label的frame
[UIView animateWithDuration:0.2 animations:^{
// tmpLabel.center = CGPointMake(btn.center.x, btn.center.y + 20);
tmpLabel.frame = CGRectMake(25 + 80*(btn.tag - 100), tmpLabel.frame.origin.y, tmpLabel.frame.size.width, tmpLabel.frame.size.height);
}];
}