自定义的tabBarController的几种方法

本文转载自:http://blog.sina.com.cn/s/blog_79c5bdc30100t88i.html

我自己实现的一种可以很方便的实现更换TabBarController图片的方法,代码如下:
#import <UIKit/UIKit.h>

@interface CustomTabBarViewController : UITabBarController {

    UIImage                             *_tabBarBackgroundImage;   //整个tabBar的背景
    NSMutableArray                       *_unSelectedImageArray;   //非选中效果的tabBarItem数组
    NSMutableArray                       *_selectedImageArray;     //选中效果的tabBarItem数组
    NSMutableArray                       *_itemBgImageViewArray;   //item背景UIIMageView数组   
    int                                  _lastSelectedIndex;       //上一次选中的tabBarItem的index

    int                                  _hiddenIndex;

}
@property (nonatomic, retain) UIImage                         *tabBarBackgroundImage;
@property (nonatomic, retain) NSMutableArray                  *unSelectedImageArray;
@property (nonatomic, retain) NSMutableArray                  *selectedImageArray;
@property (nonatomic, retain) NSMutableArray                  *itemBgImageViewArray;
@property (nonatomic, assign) int                             lastSelectedIndex;
@property (nonatomic, assign) int                             hiddenIndex;

- (id)initWithTabBarBackgroundImage:(UIImage *)barBackgroundImage 
              unSelectedImageArray:(NSMutableArray *)unImageArray
                 selectedImageArray:(NSMutableArray *)imageArray;

//隐藏某个tabBarItem的图片
-(void)hiddeItemImageView:(int)index;
//显示某个tabBarItem的图片
-(void)showItemImageView:(int)index;

@end

#import "CustomTabBarViewController.h"
#define TabBarBackgroundImageViewTag 11111
@implementation CustomTabBarViewController
@synthesize tabBarBackgroundImage                       = _tabBarBackgroundImage;
@synthesize unSelectedImageArray                        = _unSelectedImageArray;
@synthesize selectedImageArray                          = _selectedImageArray;
@synthesize itemBgImageViewArray                        = _itemBgImageViewArray;
@synthesize lastSelectedIndex                           = _lastSelectedIndex;
@synthesize hiddenIndex                                 = _hiddenIndex;


- (void)dealloc
{   
   self.tabBarBackgroundImage = nil;

    self.unSelectedImageArray = nil;

    self.selectedImageArray = nil;

    self.itemBgImageViewArray = nil;

    [super dealloc];

}

 

- (void)didReceiveMemoryWarning

{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
    self.tabBarBackgroundImage = nil;
}

 

- (id)initWithTabBarBackgroundImage:(UIImage *)barBackgroundImage 

               unSelectedImageArray:(NSMutableArray *)unImageArray

                 selectedImageArray:(NSMutableArray *)imageArray {

    self = [super init];

    if (self) {

        

//        self.tabBarBackgroundImage = barBackgroundImage;

//        self.unSelectedImageArray = unImageArray;

//        self.selectedImageArray = imageArray;

//        

//        self.itemBgImageViewArray = [NSMutableArray array];

//        _lastSelectedIndex = 0;

//        _hiddenIndex = -1;

    }

    return self;

}

 

- (id)init {

    self = [super init];

    if (self) {

//        self.tabBarBackgroundImage = [UIImage imageNamed:@"menu_bg.png"];

//        

//        NSMutableArray *aunSelectedImageArray = [[NSMutableArray alloc] initWithObjects:[UIImage imageNamed:@"menu_paiyou.png"], 

//                                                 [UIImage imageNamed:@"menu_chat.png"], 

//                                                 [UIImage imageNamed:@"menu_map.png"], 

//                                                 [UIImage imageNamed:@"menu_renwu.png"],

//                                                 [UIImage imageNamed:@"menu_huibao.png"], nil];

//        self.unSelectedImageArray = aunSelectedImageArray;

//        [aunSelectedImageArray release];

//        

//        NSMutableArray *aselectedImageArray = [[NSMutableArray alloc] initWithObjects:[UIImage imageNamed:@"menu_paiyou_pressed.png"], 

//                                               [UIImage imageNamed:@"menu_chat_pressed.png"], 

//                                               [UIImage imageNamed:@"menu_map_pressed.png"], 

//                                               [UIImage imageNamed:@"menu_renwu_pressed.png"], 

//                                               [UIImage imageNamed:@"menu_huibao_pressed.png"], nil];

//        self.selectedImageArray = aselectedImageArray;

//        [aselectedImageArray release];

//        

//        self.itemBgImageViewArray = [NSMutableArray array];

//        _lastSelectedIndex = 0;

//        _hiddenIndex = -1;

        

    }

    return self;

}

 

#pragma mark - itemIndex methods

 

- (void)setLastSelectedIndex:(int)lastSelectedIndex {

    if (_lastSelectedIndex != lastSelectedIndex) {

        //将上次的选中效果取消

        UIImageView *lastSelectedImageView = (UIImageView *)[_itemBgImageViewArray objectAtIndex:_lastSelectedIndex];;

        lastSelectedImageView.image = [_unSelectedImageArray objectAtIndex:_lastSelectedIndex];

        _lastSelectedIndex = lastSelectedIndex;
    }
}

- (void)setSelectedIndex:(NSUInteger)selectedIndex {

    [super setSelectedIndex:selectedIndex];

    //将上次的选中效果取消

    self.lastSelectedIndex = selectedIndex;

    //将本次的选中效果显示

    UIImageView *selectedImageView = (UIImageView *)[_itemBgImageViewArray objectAtIndex:selectedIndex];

    selectedImageView.image = [_selectedImageArray objectAtIndex:selectedIndex];

}

 

//隐藏某个tabBarItem的图片

- (void)hiddeItemImageView:(int)index {

    if (_hiddenIndex != index) {

        _hiddenIndex = index;

        

        UIImageView *hiddenImageView = (UIImageView *)[_itemBgImageViewArray objectAtIndex:_hiddenIndex];

        hiddenImageView.hidden = YES;

    }

}

 

//显示某个tabBarItem的图片

- (void)showItemImageView:(int)index {

    if (_hiddenIndex == index) {

        UIImageView *hiddenImageView = (UIImageView *)[_itemBgImageViewArray objectAtIndex:_hiddenIndex];

        hiddenImageView.hidden = NO;

        

        _hiddenIndex = -1;

    }

}

 

#pragma mark - View lifecycle

 

// Implement loadView to create a view hierarchy programmatically, without using a nib.

- (void)loadView

{

    [super loadView];

    self.tabBarBackgroundImage = [UIImage imageNamed:@"menu_bg.png"];

    NSMutableArray *aunSelectedImageArray = [[NSMutableArray alloc] initWithObjects:[UIImageimageNamed:@"menu_paiyou.png"], 

                                             [UIImage imageNamed:@"menu_chat.png"], 

                                             [UIImage imageNamed:@"menu_map.png"], 

                                             [UIImage imageNamed:@"menu_renwu.png"],

                                             [UIImage imageNamed:@"menu_huibao.png"], nil];

    self.unSelectedImageArray = aunSelectedImageArray;

    [aunSelectedImageArray release];

    

    NSMutableArray *aselectedImageArray = [[NSMutableArray alloc] initWithObjects:[UIImageimageNamed:@"menu_paiyou_pressed.png"], 

                                           [UIImage imageNamed:@"menu_chat_pressed.png"], 

                                           [UIImage imageNamed:@"menu_map_pressed.png"], 

                                           [UIImage imageNamed:@"menu_renwu_pressed.png"], 

                                           [UIImage imageNamed:@"menu_huibao_pressed.png"], nil];

    self.selectedImageArray = aselectedImageArray;

    [aselectedImageArray release];

    

    self.itemBgImageViewArray = [NSMutableArray array];

    _lastSelectedIndex = 0;

    _hiddenIndex = -1;

}

 

 

#define ItemWidth 50

#define ItemHeight 49

#define SideMarginX 7

#define SideMarginY 0.5

#define Spacing 14

 

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.

- (void)viewDidLoad

{

    [super viewDidLoad];

    UIImageView *tabBarBackgroundImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0,self.tabBar.frame.size.width, self.tabBar.frame.size.height)];

    tabBarBackgroundImageView.tag = TabBarBackgroundImageViewTag;

    tabBarBackgroundImageView.contentMode = UIViewContentModeScaleAspectFit;

    tabBarBackgroundImageView.image = _tabBarBackgroundImage;

    [self.tabBar insertSubview:tabBarBackgroundImageView atIndex:0];

    [tabBarBackgroundImageView release];

 for (int i = 0; i < 5; i++) {

UIImageView *itemBg  = [[UIImageView alloc] initWithFrame:CGRectMake(SideMarginX +ItemWidth * i + Spacing * i, SideMarginY, ItemWidth, ItemHeight)];

    itemBg.contentMode = UIViewContentModeScaleAspectFit;

    itemBg.image = [_unSelectedImageArray objectAtIndex:i];

    [self.tabBar insertSubview:itemBg atIndex:1];

    [_itemBgImageViewArray addObject:itemBg];

    [itemBg release];

}

    self.selectedIndex = 0;

}

 

- (void)viewDidUnload

{

    [super viewDidUnload];

    // Release any retained subviews of the main view.

    // e.g. self.myOutlet = nil;

    self.itemBgImageViewArray = nil;

}

 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

{

    // Return YES for supported orientations

    return (interfaceOrientation == UIInterfaceOrientationPortrait);

}


#pragma mark - UITabBarDelegate

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item {

    self.selectedIndex = [tabBar.items indexOfObject:item];

}

 

@end

other

 1 #import <UIKit/UIKit.h>
 2 #import <QuartzCore/QuartzCore.h>
 3 
 4 @interface XDTabBarController : UIViewController//UITabBarController
 5 {
 6     NSMutableArray *itemButtons;
 7     int currentSelectedIndex;
 8     UIView *customTabBarView;
 9     UIImageView *tabBarBgImgView;
10     UIImageView *slideBg;
11     
12     NSArray *viewControllers;
13     UINavigationController *contentNavigation;
14 }
15 
16 @property (nonatomic, strong) UIView *customTabBarView;
17 @property (nonatomic, strong) NSMutableArray *itemButtons;
18 @property (nonatomic, assign) int currentSelectedIndex;
19 @property (nonatomic, strong)  NSArray *viewControllers;
20 
21 - (void)setControllers: (NSArray *)array;
22 
23 @end
View Code
#import "XDTabBarController.h"
//首页
#define KLogoViewHeight 40
#define KCustomTabBarHeight 44
#define KTypeScrollViewHeight 30
#define KPictureScrollerViewHeight 130
#define KNewListHeight (460 - KCustomTabBarHeight - KLogoViewHeight - KTypeScrollViewHeight)

static BOOL FIRSTTIME =YES;

@interface XDTabBarController ()


- (void)customTabBar;

- (void)slideTabItemBg:(UIButton *)button;

- (void)selectedTabItem: (UIButton *)button;

@end

@implementation XDTabBarController

@synthesize customTabBarView;
@synthesize itemButtons;
@synthesize currentSelectedIndex;
@synthesize viewControllers;

- (void)setControllers: (NSArray *)array
{
    viewControllers = array;
    contentNavigation = [[UINavigationController alloc] initWithRootViewController: [array objectAtIndex:0]];
    [self.view addSubview: contentNavigation.view];
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear: animated];
    
    if (FIRSTTIME) {
        
        slideBg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"selectedTabbarItemBg.png"]];//选中时阴影层
        slideBg.alpha = 0.5;
        [self customTabBar];
        FIRSTTIME = NO;
    }
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark - custom methods
- (void)customTabBar
{
    CGRect tabBarFrame = CGRectMake(0, self.view.frame.size.height - KCustomTabBarHeight, 320, KCustomTabBarHeight);
    customTabBarView = [[UIView alloc] initWithFrame: tabBarFrame];
    tabBarBgImgView = [[UIImageView alloc] initWithFrame: CGRectMake(0, 0, 320, KCustomTabBarHeight)];
    tabBarBgImgView.image = [UIImage imageNamed:@"tabBarBg.png"];
    [customTabBarView addSubview: tabBarBgImgView];
    
    //创建按钮
    int viewCount = viewControllers.count > 5 ? 5 : viewControllers.count;
    self.itemButtons = [NSMutableArray arrayWithCapacity:viewCount];
    double _width = 320 / viewCount;
    double _height = KCustomTabBarHeight;
    for (int i = 0; i < viewCount; i++) 
    {
        UIViewController *v = [viewControllers objectAtIndex:i];
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        btn.tag = i;
        btn.frame = CGRectMake(i * _width, 0, _width, _height);
        [btn addTarget:self action:@selector(selectedTabItem:) forControlEvents: UIControlEventTouchUpInside];
        [btn setImage:v.tabBarItem.image forState:UIControlStateNormal];
        [btn setImageEdgeInsets:UIEdgeInsetsMake(-10, 0, 0, 0)];
        
        //添加标题
        UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, _height-18, _width, _height-30)];
        titleLabel.backgroundColor = [UIColor clearColor];
        titleLabel.text = v.tabBarItem.title;
        [titleLabel setFont:[UIFont systemFontOfSize:10]];
        titleLabel.textAlignment = UITextAlignmentCenter;
        titleLabel.textColor = [UIColor whiteColor];
        [btn addSubview:titleLabel];        
        
        [self addChildViewController: v];
        [self.itemButtons addObject:btn];
        [customTabBarView addSubview:btn];
        
        [titleLabel release];
    }
    
    [self.view addSubview: customTabBarView];
    [customTabBarView addSubview: slideBg];
    
    [self performSelector:@selector(slideTabItemBg:) withObject:[self.itemButtons objectAtIndex:0]];
    self.currentSelectedIndex = 0;
}

//切换滑块位置
- (void)slideTabItemBg:(UIButton *)button
{
    [UIView beginAnimations:nil context:nil];  
    [UIView setAnimationDuration:0.20];  
    [UIView setAnimationDelegate:self];
    slideBg.frame = button.frame;
    [UIView commitAnimations];
    CAKeyframeAnimation * animation; 
    animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"]; 
    animation.duration = 0.50; 
    animation.delegate = self;
    animation.removedOnCompletion = YES;
    animation.fillMode = kCAFillModeForwards;
    NSMutableArray *values = [NSMutableArray array];
    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)]];
    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]]; 
    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.9, 0.9, 0.9)]]; 
    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)]];
    animation.values = values;
    [button.layer addAnimation:animation forKey:nil];
}


- (void)selectedTabItem: (UIButton *)button
{
    if (self.currentSelectedIndex != button.tag)
    {
        [[[viewControllers objectAtIndex: self.currentSelectedIndex] view] removeFromSuperview];
        
        //[[self.viewControllers objectAtIndex:button.tag] popToRootViewControllerAnimated:YES];
        UIViewController *viewController = [viewControllers objectAtIndex:button.tag];
        [self.view addSubview: viewController.view];
        [self.view bringSubviewToFront: self.customTabBarView];
        //return;
        
        [self performSelector:@selector(slideTabItemBg:) withObject:button];
    }
    
    self.currentSelectedIndex = button.tag;
}

@end
View Code

方法二:http://www.cocoachina.com/bbs/read.php?tid-62061-page-1.html

方法三:http://hi.baidu.com/yunhuaikong/blog/item/b0642bcbfc5ae49fc817684c.html
自定义Badge:https://github.com/boctor/idev-recipes/tree/master/CustomTabBarNotification
一些自定义控件:https://github.com/boctor/idev-recipes/tree/master/CustomTabBarNotification
原文地址:https://www.cnblogs.com/hl666/p/3696822.html