//.h
#import 
#define ScrollWidht self.view.bounds.size.width
#define ScrollHight self.view.bounds.size.height
#define CustomTabBarHight 49
#define ImageWidth 30
#define ImageHight 30
#define ImageNumber 4
@interface MyTabBarViewController : UITabBarController

@property (assign,readwrite,nonatomic)UIView * selectionIndicatorImage;
@end
//.m
#import "MyTabBarViewController.h"
#import "FristViewController.h"
#import "SecondViewController.h"
#import "ThridViewController.h"
#import "FouthViewController.h"
@interface MyTabBarViewController ()
{
    UIButton * resetButton;
}
@end

@implementation MyTabBarViewController

- (instancetype)init
{
    self = [super init];
    if (self) {
        
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    [self createViewControlls];
    
    [self createTabBar];
}

- (UINavigationController *)createNavigationControllerWithVCClassName:(NSString * )className
{
    Class vcClass = NSClassFromString(className);
    
    UIViewController * vcClassName = [[vcClass alloc]init];
    
    return [[UINavigationController alloc]initWithRootViewController:vcClassName];
}

- (void)createViewControlls
{
    NSArray * arrayOfClass = @[@"FristViewController",@"SecondViewController",@"ThridViewController",@"FouthViewController"];
    
    NSMutableArray * vcArray = [[NSMutableArray alloc]init];
    
    for (int i = 0; i < arrayOfClass.count; i++)
    {
        UINavigationController * nav = [self createNavigationControllerWithVCClassName:arrayOfClass[i]];
        
        [vcArray addObject:nav];
    }
    
    self.viewControllers = vcArray;
}

- (void)createTabBar
{
    self.tabBar.hidden = YES;
    
    UIImageView  * customtabBarView = [[UIImageView alloc]init];
    
    //customtabBarView.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.8];
    
    customtabBarView.backgroundColor = [UIColor whiteColor];
    
    customtabBarView.alpha = 0.8;
    
    customtabBarView.userInteractionEnabled = YES;
    
    float customtabBarViewX = 0;
    float customtabBarViewY = ScrollHight - CustomTabBarHight;
    
    customtabBarView.frame = CGRectMake(customtabBarViewX, customtabBarViewY, ScrollWidht, CustomTabBarHight);
    
    [self.view addSubview:customtabBarView];
    
    float btnSpace = (ScrollWidht - ImageWidth*ImageNumber)/5.0;
    
    float btnY = (CustomTabBarHight - ImageHight)/2.0;
    
    for (int i = 0; i < ImageNumber; i++)
    {
        UIButton * btn = [UIButton buttonWithType:UIButtonTypeSystem];
        
        float btnX = btnSpace + (btnSpace + ImageWidth)*i;
        
        btn.frame = CGRectMake(btnX, btnY, ImageWidth, ImageHight);
        
        btn.tag = 100+i;
        
        [btn setBackgroundImage:[UIImage p_w_picpathNamed:[NSString stringWithFormat:@"tab_%d.png",i]] forState:UIControlStateNormal];
        
        [btn setBackgroundImage:[UIImage p_w_picpathNamed:[NSString stringWithFormat:@"tab_c%d.png",i]] forState:UIControlStateSelected];
        
        [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
        
        if (i == 0)
        {
            btn.selected = YES;
            resetButton = btn;
            
            _selectionIndicatorImage = [self setSelectedImage];
            
            _selectionIndicatorImage.frame = btn.frame;
            
            [customtabBarView addSubview:_selectionIndicatorImage];
        }
        
        [customtabBarView addSubview:btn];
    }
}

- (UIView *)setSelectedImage
{
    static  UIView * view = nil;
    if (!view)
    {
        view  = [[UIView alloc]init];
        view.backgroundColor = [UIColor orangeColor];
    }
   
    return view;
}

- (void)btnClick:(UIButton *)btn
{
    resetButton.selected = NO;
    resetButton = btn;
    btn.selected = YES;
    
    CGPoint centerOfselectionIndicatorImage = btn.center;
    
    [UIView animateWithDuration:0.25 animations:^{
       
        _selectionIndicatorImage.center = centerOfselectionIndicatorImage;
        
    }];
    
    self.selectedIndex = btn.tag - 100;
}

@end

总结:使用预定义使得代码具有可扩展性,编程过程中.m文件尽量避免出现数字,命名一定要规范,条理要清晰!