zoukankan      html  css  js  c++  java
  • 自己定义UITabBarController

    网上大多的自己定义TabBar都是继承View的,项目中要用到path+Tabbat这种话(path用的MMDrawerController这个框架),继承View的Tabbar是无法满足条件的(不是一个容器)。以下就介绍下自己写的一个自己定义TabBar。

    和系统自带的写法差点儿相同,先看下原生的写法例如以下:

    首先在.h中自己定义一个UITabBarController* tabBarViewController; 接着在.m中来做实现,

    tabBarViewController = [[UITabBarController alloc]init];
       
        
        FirstViewController* first = [[FirstViewController alloc]init];
        UINavigationController * navOne = [[UINavigationController alloc] initWithRootViewController:first ];
        [navOne setNavigationBarHidden:TRUE];
       
        SecondViewController* second = [[SecondViewController alloc]init];
        UINavigationController * navtwo = [[UINavigationController alloc] initWithRootViewController:second ];
        [navtwo setNavigationBarHidden:TRUE];
        
        ViewController3 *vc3 = [[ViewController3 alloc] init];
        UINavigationController * nav3 = [[UINavigationController alloc] initWithRootViewController:vc3 ];
        [nav3 setNavigationBarHidden:TRUE];
        ViewController5 *vc5 = [[ViewController5 alloc] init];
        UINavigationController * nav5 = [[UINavigationController alloc] initWithRootViewController:vc5 ];
        [nav5 setNavigationBarHidden:TRUE];
        
        tabBarViewController.viewControllers = [NSArray arrayWithObjects:navOne, navtwo,nav3,nav5, nil];
        [first release];
        [second release];
        [vc3 release];
        [vc5 release];
        
        UITabBar *tabBar = tabBarViewController.tabBar;
        UITabBarItem *tabBarItem1 = [tabBar.items objectAtIndex:0];
        UITabBarItem *tabBarItem2 = [tabBar.items objectAtIndex:1];
        UITabBarItem *tabBarItem3 = [tabBar.items objectAtIndex:2];
        UITabBarItem *tabBarItem4 = [tabBar.items objectAtIndex:3];
        
        tabBarItem1.title = @"消息";
        tabBarItem2.title = @"应用";
        tabBarItem3.title = @"通讯录";
        tabBarItem4.title = @"我";
        
        [tabBarItem1 setFinishedSelectedImage:[UIImage imageNamed:@"home_selected.png"] withFinishedUnselectedImage:[UIImage imageNamed:@"home.png"]];
        [tabBarItem2 setFinishedSelectedImage:[UIImage imageNamed:@"maps_selected.png"] withFinishedUnselectedImage:[UIImage imageNamed:@"maps.png"]];
        [tabBarItem3 setFinishedSelectedImage:[UIImage imageNamed:@"myplan_selected.png"] withFinishedUnselectedImage:[UIImage imageNamed:@"myplan.png"]];
        [tabBarItem4 setFinishedSelectedImage:[UIImage imageNamed:@"settings_selected.png"] withFinishedUnselectedImage:[UIImage imageNamed:@"settings.png"]];
        UIImage* tabBarBackground = [UIImage imageNamed:@"tabbar.png"];
        [[UITabBar appearance] setBackgroundImage:tabBarBackground];
       [[UITabBar appearance] setSelectionIndicatorImage:[UIImage imageNamed:@"tabbar_selected.png"]];
        
        [[UITabBarItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
                                                           [UIColor whiteColor], UITextAttributeTextColor,
                                                           nil] forState:UIControlStateNormal];
       UIColor *titleHighlightedColor = [UIColor greenColor];
       [[UITabBarItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
                                                           titleHighlightedColor, UITextAttributeTextColor,
                                                           nil] forState:UIControlStateSelected];


    以下来看下自己定义的方法,也是在.h文件里定义

    UITabBarController* tabBarViewController; 

    在定义一个long preSelect变量,这个变量用来推断点击是哪个selectedIndex。

    在.m中的详细实现例如以下:

     NSMutableArray *arrController = [[NSMutableArray alloc]init];
        //信息
        MessageViewController *messageVC = [[MessageViewController alloc]initWithNibName:@"MessageViewController" bundle:nil];
        
        UINavigationController * navMessage = [[UINavigationController alloc] initWithRootViewController:messageVC ];
        [messageVC release];
        
        [navMessage setNavigationBarHidden:TRUE];
        [arrController addObject:navMessage];
        [navMessage release];
        //应用
        AppsViewController *appsVC = [[AppsViewController alloc]initWithNibName:@"AppsViewController" bundle:nil];
        
        UINavigationController *navApps = [[UINavigationController alloc] initWithRootViewController:appsVC];
        [appsVC release];
        [navApps setNavigationBarHidden:TRUE];
        [arrController addObject:navApps];
        [navApps release];
        //通讯录
        AddressViewController *addressVC = [[AddressViewController alloc]initWithNibName:@"AddressViewController" bundle:nil];
        
        UINavigationController *navAddress = [[UINavigationController alloc] initWithRootViewController:addressVC];
        [addressVC release];
        [navAddress setNavigationBarHidden:TRUE];
        [arrController addObject:navAddress];
        [navAddress release];
        //我
        MeViewController *meVC = [[MeViewController alloc]initWithNibName:@"MeViewController" bundle:nil];
        
        UINavigationController *navMe = [[UINavigationController alloc] initWithRootViewController:meVC];
        [meVC release];
        [navMe setNavigationBarHidden:TRUE];
        [arrController addObject:navMe];
        [navMe release];
        
        
        tabBarViewController=[[UITabBarController alloc] init];
        
        tabBarViewController.viewControllers=arrController;
        [arrController release];
        preSelect = 1;
        for (int i = 0; i<4; i++) {
            NSString *nalString = [NSString stringWithFormat:@"tabbar_unselecte%d.png", i+1];
            NSString *highString = [NSString stringWithFormat:@"tabbar_selected%d.png", i+1];
            UIImage *nalImage = [UIImage imageNamed:nalString];
            UIImage *highImage = [UIImage imageNamed:highString];
            
            UIButton *tabbarBtn = [UIButton buttonWithType:UIButtonTypeCustom];
            tabbarBtn.frame = CGRectMake(i*(320/4), 0, (320/4), 46);
            [tabbarBtn addTarget:self action:@selector(tabbarBtnPress:) forControlEvents:UIControlEventTouchUpInside];
            [tabbarBtn setBackgroundImage:nalImage forState:UIControlStateNormal];
            [tabbarBtn setBackgroundImage:highImage forState:UIControlStateSelected];
            tabbarBtn.tag = 100+i;
            [tabBarViewController.tabBar addSubview:tabbarBtn];
            
            if (i == 1) {
                tabbarBtn.selected = YES;
                tabBarViewController.selectedIndex=1;
            }
        }

    主要是思路就是自己定义UITabBarController的tabBar属性,在它上面addSubview。因为加的UIButton,如今就要实现点击

    方法来切换。

    方法例如以下:

    -(void)tabbarBtnPress:(UIButton *)tabbarBtn
    {
        if (preSelect != tabbarBtn.tag -100 ) {
            
            UIButton *prvBtn = (UIButton *)[tabbarBtn.superview viewWithTag:preSelect+100];
            prvBtn.selected = NO;
            
            tabBarViewController.selectedIndex = preSelect = tabbarBtn.tag-100;
            
            UIButton *button = (UIButton *)[tabbarBtn.superview viewWithTag:tabbarBtn.tag];
            button.selected = YES;
        }
    }

    到此就完毕了。有什么不正确地方请大家指出来。

    5.29日补充:

    上面写的是默认是选中第2个tabbar,选中第一个时。仅仅须要改动preSelect =0;和

    if(i==0)

    {

    tabbarBtn.selected =YES;

                self.selectedIndex=0;

    }

    
    

    假设想把这个独立出来,仅仅须要定义一个继承UITabBarController的类。

    假设想用自己定义的背景也能够 。能够把系统的给隐藏(self.tabBar.hidden =YES;),自己定义一个View,加到tabbar上。[self.view addSubview:xxxx]; ,其他还是用上面的方法。



    6.3:

    发现了一个问题。VC的nav不显示,找了下原因,发现 tabbarController.viewControllers 中设置是VC数组,不是nav数组。



  • 相关阅读:
    Nginx 前后端分离部署
    SpringBoot 使用外部 Tomcat 容器运行
    SpringBoot 加载 properties
    SpringBoot 启动时加载的自动配置类(SpringFactoriesLoader、SPI)
    微信小程序订阅消息通知
    centos云服务器 部署Gitblit
    centos 安装java
    图片链接控制宽高
    腾讯云部署https
    腾讯云域名绑定
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5183100.html
Copyright © 2011-2022 走看看