zoukankan      html  css  js  c++  java
  • iOS自定义Tabbar

    因为公司需求,苹果的原生tabBar已经不能满足本人类的需求,我在网上查了下,觉得还是自己写一个tabBar比较好。

    虽然是自定义tabBar,还是在原生基础上写

    基本思路就是:隐藏系统原生tabBar,自己写一个tabView(一个自定义View)放在底部当成tabBar,在点击View上面的button的时候调用原生方法,实现控制器切换

    可以实现的功能:

    1 可以自己随意的隐藏显示tabBar,实现一些关于tabBar的动画,所有的一切只需要设置tabView就可以了

    2 可以自定义tabBar的样式,在tabBar上添加背景图,添加气泡等等完全无压力

    在网上找了一个别人写好的tabBar,然后自己修改了一下,立即就可以实现需求,非常方便

    CBTabBar

    只有两个类

    CBTabBarViewController的.h代码

    #import <UIKit/UIKit.h>
    
    /*
     *可以实现隐藏tabBar功能
     */
    
    
    @interface CBTabBarViewController : UITabBarController
    -(void)hidCBTabbar:(BOOL)ishid;
    @property (nonatomic, strong) NSArray           * imageNameArray;
    @property (nonatomic, strong) NSArray           * imageName_sel_Array;
    -(instancetype)initWithImageArray:(NSArray *)array andImageSelArray:(NSArray *)selArray;
    -(void)setSelectedButton:(NSUInteger)selectedIndex;
    @end

    CBTabBarViewController的.m代码

    #import "CBTabBarViewController.h"
    #import "CBTabBarButton.h"
    @interface CBTabBarViewController (){
        UIView * myView;
        NSMutableArray * _buttonArray;
    }
    @property (nonatomic, weak) UIButton *selectedBtn;
    @end
    
    @implementation CBTabBarViewController
    
    -(instancetype)initWithImageArray:(NSArray *)array andImageSelArray:(NSArray *)selArray{
        self = [super init];
        if (self) {
    
            
            self.imageNameArray = array;
            self.imageName_sel_Array = selArray;
            [self loadSubView];//添加自定义tabBar
        }
        return self;
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.imageNameArray = [NSArray array];
        self.imageName_sel_Array = [NSArray array];
        _buttonArray = [[NSMutableArray alloc] init];
    }
    
    -(void)loadSubView{
        
        
        //删除现有的tabBar
        CGRect rect = self.tabBar.frame;
        [self.tabBar removeFromSuperview];  //移除TabBarController自带的下部的条
        
        
        
        //添加自己的视图
        /*
         *tabBar的底部View
         *背景图,button都会添加到这个myVIew上面
         *可以自己添加其他View
         */
        myView = [[UIView alloc] init];
        myView.frame = rect;
    //    myView.backgroundColor = [UIColor redColor];
        [self.view addSubview:myView];
        
        
        
        //给tabBar添加自定义背景图
        UIImageView * imageView = [[UIImageView alloc] init];
        imageView.image = [UIImage imageNamed:@"tabBarBGImg"];
        imageView.frame = CGRectMake(0, 0, myView.frame.size.width, myView.frame.size.height);
        [myView addSubview:imageView];
    
        
        
        if (self.imageName_sel_Array.count < 1 || self.imageNameArray.count < 1) {
            return;
        }
        [_buttonArray removeAllObjects];
        for (int i = 0; i < 5; i++) {
            
            CGFloat x = i * myView.frame.size.width / 5;
            
            UIView * view = [[UIView alloc] initWithFrame:CGRectMake(x, 2, myView.frame.size.width / 5, myView.frame.size.height)];
            [myView addSubview:view];
            if (i == 2) {
                view.frame = CGRectMake(x, 0, myView.frame.size.width / 5, myView.frame.size.height);
            }
            
            
            //tabber 上面的button
            CBTabBarButton *btn = [[CBTabBarButton alloc] init];
            
            NSString *imageName = [self.imageNameArray objectAtIndex:i];
            NSString *imageNameSel = [self.imageName_sel_Array objectAtIndex:i];
            
            [btn setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
            [btn setImage:[UIImage imageNamed:imageNameSel] forState:UIControlStateSelected];
            
            btn.tag = i;//设置按钮的标记, 方便来索引当前的按钮,并跳转到相应的视图
            [btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
            
            btn.center = CGPointMake(view.frame.size.width / 2, view.frame.size.height / 2);
            btn.bounds = CGRectMake(0, 0, 40, 40);
            
            [view addSubview:btn];
            [_buttonArray addObject:btn];
    
            
            //设置刚进入时,第一个按钮为选中状态
            if (0 == i) {
                btn.selected = YES;
                self.selectedBtn = btn;  //设置该按钮为选中的按钮
            }  
        }
    }
    
    
    //通过点击tabBar上面的button来跳转控制器
    - (void)clickBtn:(UIButton *)button {
        //1.先将之前选中的按钮设置为未选中
        self.selectedBtn.selected = NO;
        //2.再将当前按钮设置为选中
        button.selected = YES;
        //3.最后把当前按钮赋值为之前选中的按钮
        self.selectedBtn = button;
        //4.跳转到相应的视图控制器. (通过selectIndex参数来设置选中了那个控制器)
        self.selectedIndex = button.tag;
    }
    
    //调用此方法来跳转控制器
    -(void)setSelectedButton:(NSUInteger)selectedIndex{
        //1.先将之前选中的按钮设置为未选中
        self.selectedBtn.selected = NO;
        //2.从buttonarray中找到当前button
        UIButton * button = [_buttonArray objectAtIndex:selectedIndex];
        //3.最后把当前按钮赋值为之前选中的按钮
        button.selected = YES;
        //4.跳转到相应的视图控制器. (通过selectIndex参数来设置选中了那个控制器)
        self.selectedIndex = selectedIndex;
    }
    
    //通过设置View的透明度来隐藏tabBar
    -(void)hidCBTabbar:(BOOL)ishid{
        if (ishid) {
            myView.alpha = 0;
        }else{
            myView.alpha = 1;
        }
    }
    

     CBTabBarButton.m代码

    -(void)setHighlighted:(BOOL)highlighted{
        //只需要取消高亮,这里什么都不用写
    }
    

     调用tabBar的代码

    #import "ViewController.h"
    
    #import "CBTabBarViewController.h"
    #import "TestViewController.h"
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        
        UIViewController *firstViewController = [[TestViewController alloc] init];
        firstViewController.view.backgroundColor = [UIColor redColor];
        UIViewController *firstNavigationController = [[UINavigationController alloc]
                                                       initWithRootViewController:firstViewController];
        
        UIViewController *secondViewController = [[TestViewController alloc] init];
        secondViewController.view.backgroundColor = [UIColor yellowColor];
        UIViewController *secondNavigationController = [[UINavigationController alloc]
                                                        initWithRootViewController:secondViewController];
        
        UIViewController *thirdViewController = [[TestViewController alloc] init];
        thirdViewController.view.backgroundColor = [UIColor greenColor];
        UIViewController *thirdNavigationController = [[UINavigationController alloc]
                                                       initWithRootViewController:thirdViewController];
        
        UIViewController *fourthViewController = [[TestViewController alloc] init];
        fourthViewController.view.backgroundColor = [UIColor orangeColor];
        UIViewController *fourthNavigationController = [[UINavigationController alloc]
                                                        initWithRootViewController:fourthViewController];
        
        UIViewController *fifthViewController = [[TestViewController alloc] init];
        fifthViewController.view.backgroundColor = [UIColor blueColor];
        UIViewController *fifthNavigationController = [[UINavigationController alloc]
                                                       initWithRootViewController:fifthViewController];
        
        
        NSArray * imageArray = [NSArray arrayWithObjects:@"sq_03",@"sq_05",@"zcfTabIcon",@"sousuo",@"wode",nil];
        NSArray * selImageArray = [NSArray arrayWithObjects:@"sq_18",@"sq_19",@"sq_16",@"sousuo_sel",@"wode_sel",nil];
        
        CBTabBarViewController * tabVC = [[CBTabBarViewController alloc] initWithImageArray:imageArray andImageSelArray:selImageArray];
        tabVC.viewControllers = @[firstNavigationController,secondNavigationController,thirdNavigationController,fourthNavigationController,fifthNavigationController];
        [tabVC setSelectedButton:0];
    
        
        UIWindow * window = [[[UIApplication sharedApplication] delegate] window];
        window.rootViewController = tabVC;
        
        
        
    }
    

     很简单的tabBar,其中的loadSubView方法可能有隐患,以后再处理

    这样靠设置frame写出来的tabBar没有横屏效果,想要实现横屏效果需要自己再写约束代码

  • 相关阅读:
    A/B test
    镜像下载python包
    Jupyter 快捷键汇总
    牛顿法(Newton's method)VS梯度下降法(Gradient Descent)
    L-BFGS算法详解(逻辑回归的默认优化算法)
    np.bincount()频率统计函数
    异常值检验实战3_NBA球员表现稳定性分析
    异常值检测方法(Z-score,DBSCAN,孤立森林)
    浅谈压缩感知(十六):感知矩阵之RIP
    浅谈压缩感知(十五):感知矩阵之spark常数
  • 原文地址:https://www.cnblogs.com/chebaodaren/p/5120429.html
Copyright © 2011-2022 走看看