zoukankan      html  css  js  c++  java
  • 完全自定义 TabBar

    //
    //  CustomTabBarController.h
    //  Dream
    //
    //  Created by mac on 14-10-17.
    //  Copyright (c) 2014年 HM. All rights reserved.
    //
    
    //标记一下方向
    typedef enum
    {
        ZYSlideDirectionRight = 0,
        ZYSlideDirectionLeft
        
    } ZYSlideDirection;
    
    #import <UIKit/UIKit.h>
    
    @interface CustomTabBarController : UIViewController<UINavigationControllerDelegate>
    {
        UIView *_myTabBarView;
    }
    @property (retain, nonatomic) NSArray *viewControllers;
    @property (retain, nonatomic) NSArray *previousNavViewController;
    @property (retain, nonatomic) NSArray *buttonArray;
    @property (retain, nonatomic) NSArray *normalImageArray;
    @property (retain, nonatomic) NSArray *highLightImageArray;
    @property (retain, nonatomic) NSArray *nameArray;
    @property (assign, nonatomic) int selectedIndex;
    
    - (instancetype)initWithNormalImage:(NSArray *)normalImageArray highLightImage:(NSArray *)highLightImageArray BtnName:(NSArray *)nameArray;
    
    - (void)tabBarButtonClick:(id)sender;
    
    - (void)showTabBar:(ZYSlideDirection)direction animated:(BOOL)isAnimated;
    - (void)hideTabBar:(ZYSlideDirection)direction animated:(BOOL)isAnimated;
    
    @end
    //
    //  CustomTabBarController.m
    //  Dream
    //
    //  Created by mac on 14-10-17.
    //  Copyright (c) 2014年 HM. All rights reserved.
    //
    
    //动画持续时间,该时间与压栈和出栈时间相当
    #define SLIDE_ANIMATION_DURATION 0.33
    
    #import "CustomTabBarController.h"
    #import "Header.h"
    
    @interface CustomTabBarController ()
    @property (retain, nonatomic) NSArray *labArray;
    @property (retain, nonatomic) NSArray *imageArray;
    @end
    
    @implementation CustomTabBarController
    
    - (void)dealloc
    {
        [_myTabBarView release];
        self.viewControllers = nil;
        self.normalImageArray = nil;
        self.highLightImageArray = nil;
        self.nameArray = nil;
        self.previousNavViewController = nil;
        self.buttonArray = nil;
        self.labArray = nil;
        self.imageArray = nil;
        [super dealloc];
    }
    
    - (instancetype)initWithNormalImage:(NSArray *)normalImageArray highLightImage:(NSArray *)highLightImageArray BtnName:(NSArray *)nameArray
    {
        if (self = [super init])
        {
            _selectedIndex = -1;
            self.normalImageArray = normalImageArray;
            self.highLightImageArray = highLightImageArray;
            self.nameArray = nameArray;
            
        }
        return self;
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        
        self.view.backgroundColor = [UIColor whiteColor];
        
        _myTabBarView = [[UIView alloc]initWithFrame:CGRectMake(0, 980, 768, 44)];
        [self.view addSubview:_myTabBarView];
        
        
        UIImageView *image = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"adv_bottom.png"]];
        image.frame = CGRectMake(0, 0, 768, 2);
        [_myTabBarView addSubview:image];
        [image release];
        
        
        NSMutableArray *arrayB = [NSMutableArray array];
        NSMutableArray *arrayI = [NSMutableArray array];
        NSMutableArray *arrayL = [NSMutableArray array];
        
        for (int i = 0; i < _nameArray.count; i ++)
        {
            UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
            btn.frame = CGRectMake(204+100*i, 2, 60, 40);
            btn.tag = i;
    //        [btn setImage:[UIImage imageNamed:_normalImageArray[i]] forState:UIControlStateNormal];
    //        [btn setImage:[UIImage imageNamed:_highLightImageArray[i]] forState:UIControlStateSelected];
            [btn addTarget:self action:@selector(tabBarButtonClick:) forControlEvents:UIControlEventTouchUpInside];
            [_myTabBarView addSubview:btn];
            [arrayB addObject:btn];
            
            
            UIImageView *imageView= [[UIImageView alloc]initWithFrame:CGRectMake(15, 3, 30, 20)];
            imageView.image = [UIImage imageNamed:_normalImageArray[i]];
            imageView.highlightedImage = [UIImage imageNamed:_highLightImageArray[i]];
            [btn addSubview:imageView];
            
            [arrayI addObject:imageView];
            [imageView release];
            
            UILabel *lab = [[[UILabel alloc]init] autorelease];
            lab.text = _nameArray[i];
            lab.textAlignment = NSTextAlignmentCenter;
            lab.font = [UIFont systemFontOfSize:12];
            lab.frame = CGRectMake(0, 25, 60, 10);
            [btn addSubview:lab];
            
            [arrayL addObject:lab];
            [lab release];
        }
        self.buttonArray = arrayB;
        self.imageArray = arrayI;
        self.labArray = arrayL;
        
        if (_selectedIndex == -1)
        {
            self.selectedIndex = 0;
        }
        else
        {
            self.selectedIndex = _selectedIndex;
        }
        
        
    }
    
    
    - (void)setSelectedIndex:(int)selectedIndex
    {
        //如果索引值没有改变不做其他操作
        if (_selectedIndex == selectedIndex) return;
        
        if (_selectedIndex >= 0)
        {
            //找出对应索引的视图控制器
            UIViewController *priviousViewController = [_viewControllers objectAtIndex:_selectedIndex];
            //移除掉
            [priviousViewController.view removeFromSuperview];
            
            UIButton *btn = _buttonArray[_selectedIndex];
            btn.selected = NO;
            
            UILabel *lab = _labArray[_selectedIndex];
            lab.textColor = [UIColor blackColor];
            
            UIImageView *image = _imageArray[_selectedIndex];
            image.image = [UIImage imageNamed:_normalImageArray[_selectedIndex]];
            
        }
        
        //记录一下当前的索引
        _selectedIndex = selectedIndex;
        
        //获得对应的按钮并且设置为高亮状态下的图片
        UIButton *currentButton = _buttonArray[_selectedIndex];
        currentButton.selected = YES;
        UILabel *lab = _labArray[_selectedIndex];
        lab.textColor = PINK(0.6);
        UIImageView *image = _imageArray[_selectedIndex];
        image.image = [UIImage imageNamed:_highLightImageArray[_selectedIndex]];
        
        //获得对应的视图控制器
        UIViewController *currentViewController = [_viewControllers objectAtIndex:_selectedIndex];
        
        //如果此条件成立表示当前是第一个,即“导航控制器”
        if ([currentViewController isKindOfClass:[UINavigationController class]])
        {
            //设置导航控制器的代理
            ((UINavigationController *)currentViewController).delegate = self;
        }
        //设置当前视图的大小
        currentViewController.view.frame = CGRectMake(0, 0, 768, self.view.bounds.size.height - 43);
        
        //添加到Tab上
        [self.view addSubview:currentViewController.view];
        
        //把视图放到TabBar下面
        [self.view sendSubviewToBack:currentViewController.view];
    
    }
    
    - (void)tabBarButtonClick:(id)sender
    {
        //获得索引
        UIButton *btn = (UIButton *)sender;
        int index = (int)btn.tag;
        
        //用self.赋值默认会调set方法
        self.selectedIndex = index;
    }
    
    #pragma mark -
    #pragma mark UINavigationControllerDelegate
    
    - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
    //    NSLog(@"vc is %@",viewController);
        /*
         第一次加载根视图:previousNavViewController当前导航控制器里面的视图控制器数组
         之后显示视图:previousNavViewController操作前的视图控制器数组
         */
        if (!_previousNavViewController)
        {
            //导航控制器中的视图数组
            self.previousNavViewController = navigationController.viewControllers;
        }
        
        /*
         是否为压栈的标记,初始化为NO
         如果原来的控制器数不大于当前导航的视图控制器数表示是压栈
         */
        BOOL isPush = NO;
        
        if ([_previousNavViewController count] <= [navigationController.viewControllers count])
        {
            isPush = YES;
        }
        
        /*
         上一个视图控制器当压栈的时候底部条是否隐藏
         当前视图控制器当压栈的时候底部条是否隐藏
         这两个视图控制器有可能是同一个
         */
        BOOL isPreviousHidden = [[_previousNavViewController lastObject] hidesBottomBarWhenPushed];
        
        BOOL isCurrentHidden = viewController.hidesBottomBarWhenPushed;
        //    [[navigationController.viewControllers lastObject] hidesBottomBarWhenPushed]
        
        //重新记录当前导航器中的视图控制器数组
        self.previousNavViewController = navigationController.viewControllers;
        
        /*
         如果状态相同不做其他操作
         如果上一个显示NO,这个隐藏YES,则隐藏TabBar
         如果上一个隐藏YES,这个显示NO,则显示TabBar
         */
        if (!isPreviousHidden && !isCurrentHidden)
        {
            return;
        }
        else if(isPreviousHidden && isCurrentHidden)
        {
            return;
        }
        else if(!isPreviousHidden && isCurrentHidden)
        {
            //隐藏tabbar 压栈
            [self hideTabBar:isPush ? ZYSlideDirectionLeft : ZYSlideDirectionRight  animated:animated];
        }
        else if(isPreviousHidden && !isCurrentHidden)
        {
            //显示tabbar 出栈
            [self showTabBar:isPush ? ZYSlideDirectionLeft : ZYSlideDirectionRight animated:animated];
        }
        
    }
    
    /*
     显示底部TabBar相关
     需要重置当前视图控制器View的高度为整个屏幕的高度-TabBar的高度
     */
    - (void)showTabBar:(ZYSlideDirection)direction animated:(BOOL)isAnimated
    {
        //根据压栈还是出栈设置TabBar初始位置
        CGRect tempRect = _myTabBarView.frame;
        tempRect.origin.x = self.view.bounds.size.width * ( (direction == ZYSlideDirectionRight) ? -1 : 1);
        _myTabBarView.frame = tempRect;
        
        //执行动画
        [UIView animateWithDuration:isAnimated ? SLIDE_ANIMATION_DURATION : 0 delay:0 options:0 animations:^
         {
             //动画效果
             CGRect tempRect = _myTabBarView.frame;
             tempRect.origin.x = 0;
             _myTabBarView.frame = tempRect;
             
         }
                         completion:^(BOOL finished)
         {
             //动画结束时
             //重置当前视图控制器View的高度为整个屏幕的高度-TabBar的高度
             UIViewController *currentViewController = [_viewControllers objectAtIndex:_selectedIndex];
             
             CGRect viewRect = currentViewController.view.frame;
             viewRect.size.height = self.view.bounds.size.height - 43;
             currentViewController.view.frame = viewRect;
         }];
    }
    
    /*
     隐藏底部TabBar相关
     需要重置当前视图控制器View的高度为整个屏幕的高度
     */
    - (void)hideTabBar:(ZYSlideDirection)direction animated:(BOOL)isAnimated
    {
        //获得当前视图控制器
        UIViewController *currentViewController = [_viewControllers objectAtIndex:_selectedIndex];
        //重置高度
        CGRect viewRect = currentViewController.view.frame;
        viewRect.size.height = self.view.bounds.size.height;
        currentViewController.view.frame = viewRect;
        
        //设置TabBar的位置
        CGRect tempRect = _myTabBarView.frame;
        tempRect.origin.x = 0;
        _myTabBarView.frame = tempRect;
        
        //采用Block的形式开启一个动画
        [UIView animateWithDuration:isAnimated ? SLIDE_ANIMATION_DURATION : 0 delay:0 options:0 animations:^(void)
         {
             //根据压栈还是出栈设置动画效果
             CGRect tempRect = _myTabBarView.frame;
             tempRect.origin.x = self.view.bounds.size.width * (direction == ZYSlideDirectionLeft ? -1 : 1);
             _myTabBarView.frame = tempRect;
             
         }
                         completion:^(BOOL finished){}
         ];
    }
    
    
    
    
    @end
  • 相关阅读:
    jsp和servlet有什么区别?
    JavaScript中null、undefined有什么区别?
    Java中的信号量Semaphore
    Java中实现线程通信方式有哪些?
    说说对于sychronized同步锁的理解
    线程的run()方法和start()方法有什么区别?
    高并发大型网站架构设计
    高并发高流量网站架构(转)
    构建高并发高可用的电商平台架构实践
    自己搭建CDN服务器静态内容加速-LuManager CDN使用教程
  • 原文地址:https://www.cnblogs.com/ningmengcao-ios/p/5769765.html
Copyright © 2011-2022 走看看