UITabBarController详解(三)自定义UITa

@有的时候,我们不想用系统提供的UITabBarController,这个时候就需要自定义了,还能实现一定的动画效果,比如仿新浪的,切换标签,会有图片随着移动

@自定义的时候,一般是用UIImageView+UIButton实现

#pragma mark - 自定义TarBar
- (void)createCustomTarBar{
    
    #pragma mark 初始化TarBar背景
    UIImageView * tarbarBackground = [[UIImageView alloc]initWithFrame:CGRectMake(0, ScreenHeight-49, ScreenWidth, 49)];
    tarbarBackground.image = [UIImage imageNamed:@"tarBarBackground"];
    // 切记,不能漏了这句话,UIImageView会阻挡程序检测到点击在button上
    tarbarBackground.userInteractionEnabled = YES;
    [self.view addSubview:tarbarBackground];
    [tarbarBackground release];
    
    #pragma mark 初始化选中时的图片
    _selectImageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"select"]];
    _selectImageView.frame = CGRectMake(5, 4, 54, 42);
    // 思考为什么,这里不需要开交互,点击button也能响应
    //selectImageView.userInteractionEnabled = NO;
    [tarbarBackground addSubview:_selectImageView];
    [_selectImageView release];
    
    #pragma mark 初始化tabBarItem----->UIButton
    NSArray * defaultBackground = @[@"tabbar_home",@"tabbar_message_center",@"tabbar_profile",@"tabbar_discover",@"tabbar_more"];
    for (int i = 0; i < 5; i++) {
        // button与tarbarBackground 是上下的层级关系
        UIButton * button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        button.frame = CGRectMake(10+64*i, 5, 44, 41);
        button.tag = TAG + i;
        [button setImage:[UIImage imageNamed:[defaultBackground objectAtIndex:i]] forState:UIControlStateNormal];
        [button addTarget:self action:@selector(onClickChangeView:) forControlEvents:UIControlEventTouchUpInside];
        [tarbarBackground addSubview:button];
    }

}

- (void)onClickChangeView:(UIButton *)button{

    self.selectedIndex = button.tag;
    // block设定动画
    [UIView animateWithDuration:0.5 animations:^{
        _selectImageView.frame = CGRectMake(5 + button.tag * 64, 4, 54, 42);
    }];

}
#pragma mark - 初始化ViewController
- (void)createTarBarViewController{
    
#pragma mark  第一个视图ViewController
    
    HMT_AViewController * tabBarViewA = [[HMT_AViewController alloc] init];
    // 设置A视图下----标签栏标题文字(可参照微信或者QQ体会)
    //tabBarViewA.tabBarItem.title = @"微信";
    // 设置A视图下----标签栏图片(因为自己没有图片,在这里随便设置了个名字)
    //tabBarViewA.tabBarItem.image = [UIImage imageNamed:@"1.png"];
    // 设置A视图下----标签栏信息提示(住:badgeValue是NSString类型 如下设置了3,就像QQ消息有3条未接受一样,给人一种提醒)
    //tabBarViewA.tabBarItem.badgeValue = @"3";
    UINavigationController * tabBarViewNA = [[UINavigationController alloc]initWithRootViewController:tabBarViewA];
    // ios7弃用了----标签栏选中的时候显示一张图片,没选中的时候显示另一张图片
    //[tabBarViewA.tabBarItem setFinishedSelectedImage:actionMenu.selectedIcon withFinishedUnselectedImage:actionMenu.icon];
    // ios7的方法(自己没有图片,所以代码里面的图片都是一个随便取的名字,没有实用意义)
    //tabBarViewA.tabBarItem.selectedImage = actionMenu.selectedIcon;
    
#pragma mark  第二个视图ViewController
    // 第二个视图ViewController
    HMT_BViewController * tabBarViewB = [[HMT_BViewController alloc] init];
    // 设置B视图下----标签栏
    // 用系统提供的标识(可以算等价于图标和文字)进行设置(参数:UITabBarSystemItem是个枚举值,想要什么形式,就去系统提供的API中找)
    //tabBarViewB.tabBarItem = [[[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemSearch tag:1]autorelease];
    // 设置B视图下----标签栏信息提示
    //tabBarViewB.tabBarItem.badgeValue = @"GO";
    
#pragma mark  第三个视图ViewController
    HMT_CViewController * tabBarViewC = [[HMT_CViewController alloc] init];
    // ViewController -- NavigationController -- UITabBarController 3者想相结合
    UINavigationController * tabBarViewNC = [[UINavigationController alloc]initWithRootViewController:tabBarViewC];
    
    tabBarViewC.tabBarItem = [[[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemDownloads tag:2]autorelease];
    // 设置B视图下----标签栏信息提示
    //tabBarViewC.tabBarItem.badgeValue = @"new";
    
#pragma mark  第四个视图ViewController
    HMT_DViewController * tabBarViewD = [[HMT_DViewController alloc] init];
    //tabBarViewD.tabBarItem = [[[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemFavorites tag:3]autorelease];
    // 设置B视图下----标签栏信息提示
    //tabBarViewD.tabBarItem.badgeValue = @"99";
    
#pragma mark  第五个视图ViewController
    HMT_EViewController * tabBarViewE = [[HMT_EViewController alloc] init];
    //tabBarViewE.tabBarItem = [[[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemHistory tag:4]autorelease];
    // 设置B视图下----标签栏信息提示
    //tabBarViewE.tabBarItem.badgeValue = @"sky";
    
#pragma mark  第六个视图ViewController(系统默认能显示的最大视图个数是5个)
    /* 如果你的viewControllers属性添加了多于五个的items,那tab bar controller将会自动插入一个特殊的view controller,
     称为 More view controller,该 controller 将会负责管理多于的items,这个More view controller提供一个自定义的界面,
     用table的方式呈现多余的view controller,并且view controller的数量是不限制的*/
    HMT_FViewController * tabBarViewF = [[HMT_FViewController alloc] init];
    //tabBarViewF.tabBarItem = [[[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemContacts tag:5]autorelease];
    // 设置F视图下----标签栏信息提示
    //tabBarViewF.tabBarItem.badgeValue = @"AG";
    

#pragma mark 设置TabBarController
    
    // 创建TabBarController
    //UITabBarController * tabBarController = [[UITabBarController alloc]init];
    // TabBarController默认是放在最底部的,如果你想调整位置,可以进行下面2部操作(44是iPhone中TabBarController和UINavigationController标准高度)
    //CGRect frame = CGRectMake(0, 20, 320, 44);
    //tabBarController.tabBar.frame = frame;
    // 每一个tab都必须有一个content view controller------->viewControllers属性,用来存入一个应用的TabBarController有多少个界面切换
    self.viewControllers = [NSArray arrayWithObjects:tabBarViewNA,tabBarViewB,tabBarViewNC,tabBarViewD,tabBarViewE,nil];
    // 设置着色
    self.tabBar.tintColor = [UIColor greenColor];
    // 设置选中图片时候
    self.tabBar.selectedImageTintColor = [UIColor redColor];
    // 设置背景图片(自己没有图片,不进行设置)
    //tabBarController.tabBar.backgroundImage = [UIImage imageNamed:@"@@@@@"];
    // 设置程序启动时默认的ViewController视图(设置为3,一共5个ViewController,进来时候显示的视图就是第4个-tabBarViewD,下标从0开始)
    //self.selectedIndex = 0;
    
    // 设置代理
    self.delegate = self;
    
    //UINavigationController *nav = tabBarController.moreNavigationController;
    //[nav setNavigationBarHidden:YES animated:YES];
    
    [tabBarViewA release];
    [tabBarViewNA release];
    [tabBarViewB release];
    [tabBarViewC release];
    [tabBarViewNC release];
    [tabBarViewD release];
    [tabBarViewE release];
    [tabBarViewF release];
    
}

// 控制哪些ViewController的标签栏能被点击
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{
    // 代表HMT_CViewController这个View无法显示,无法点击到它代表的标签栏
    /*if ([viewController isKindOfClass:[HMT_CViewController class]]) {
        return NO;
    }*/
    
    return YES;
    
}

// 选中哪个标签栏,一个监控作用吧
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{
    
    NSLOG_FUNCTION;
}

// More view controller 将要开始编辑
- (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers{
    
    NSLOG_FUNCTION;
    
}

// More view controller 将要结束编辑
- (void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed{
    
    NSLOG_FUNCTION;
    
}

// More view controller 编辑
- (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed{
    
    NSLOG_FUNCTION;
    
}

文章导航