1、MyTabBarViewController.m
#import "MyTabBarViewController.h"
#import "XNTabBar.h"
@interface MyTabBarViewController ()<XNTabBarDelegate>
@end
@implementation MyTabBarViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self creatViewControllers];
//删除现有的tabBar
CGRect rect = self.tabBar.bounds; //这里要用bounds来加, 否则会加到下面去.看不见
//[self.tabBar removeFromSuperview]; //移除TabBarController自带的下部的条
//测试添加自己的视图
XNTabBar *myView = [[XNTabBar alloc] init]; //设置代理必须改掉前面的类型,不能用UIView
myView.delegate = self; //设置代理
myView.frame = rect;
[self.tabBar addSubview:myView]; //添加到系统自带的tabBar上, 这样可以用的的事件方法. 而不必自己去写
//为控制器添加按钮
for (int i=0; i<self.viewControllers.count; i++) { //根据有多少个子视图控制器来进行添加按钮
NSString *imageName = [NSString stringWithFormat:@"TabBar%d", i + 1];
NSString *imageNameSel = [NSString stringWithFormat:@"TabBar%dSel", i + 1];
UIImage *image = [UIImage imageNamed:imageName];
UIImage *imageSel = [UIImage imageNamed:imageNameSel];
[myView addButtonWithImage:image selectedImage:imageSel];
}
}
- (void)creatViewControllers{
NSArray *tabViewControllers = @[@"ViewController",
@"ViewController2"
];
NSMutableArray *viewControllerArr = [NSMutableArray array];
for (int i = 0; i<tabViewControllers.count; i++) {
UIViewController *vc = [[NSClassFromString(tabViewControllers[i]) alloc] init];
UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:vc];
[viewControllerArr addObject:navi];
}
self.viewControllers = viewControllerArr;
}
- (void)tabBar:(XNTabBar *)tabBar selectedFrom:(NSInteger)from to:(NSInteger)to{
self.selectedIndex = to;
}
@end
2、XNTabBarButton.h
//
// XNTabBarButton.h
// Tabbar
//
// Created by 张鹤 on 16/2/3.
// Copyright © 2016年 张鹤. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface XNTabBarButton : UIButton
@end
XNTabBarButton.m
//
// XNTabBarButton.m
// Tabbar
//
// Created by 张鹤 on 16/2/3.
// Copyright © 2016年 张鹤. All rights reserved.
//
#import "XNTabBarButton.h"
@implementation XNTabBarButton
- (void)setHighlighted:(BOOL)highlighted{
}
@end
3、XNTabBar.h
//
// XNTabBar.h
// Tabbar
//
// Created by 张鹤 on 16/2/3.
// Copyright © 2016年 张鹤. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@class XNTabBar;
@protocol XNTabBarDelegate <NSObject>
- (void) tabBar:(XNTabBar *)tabBar selectedFrom:(NSInteger) from to:(NSInteger)to;
@end
@interface XNTabBar : UIView
@property (nonatomic,weak) id <XNTabBarDelegate> delegate;
- (void)addButtonWithImage:(UIImage *)image selectedImage:(UIImage *)selectedImage;
@end
XNTabBar.m
//
// XNTabBar.m
// Tabbar
//
// Created by 张鹤 on 16/2/3.
// Copyright © 2016年 张鹤. All rights reserved.
//
#import "XNTabBar.h"
@interface XNTabBar(){
}
/**
* 设置之前选中的按钮
*/
@property (nonatomic, weak) UIButton *selectedBtn;
@end
@implementation XNTabBar
- (void)addButtonWithImage:(UIImage *)image selectedImage:(UIImage *)selectedImage{
UIButton *btn = [[UIButton alloc] init];
[btn setImage:image forState:UIControlStateNormal];
[btn setImage:selectedImage forState:UIControlStateSelected];
[self addSubview:btn];
[btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
if (self.subviews.count == 1) {
[self clickBtn:btn];
}
}
/**专门用来布局子视图, 别忘了调用super方法*/
- (void)layoutSubviews {
[super layoutSubviews];
NSInteger count = self.subviews.count;
for (int i = 0; i < count; i++) {
//取得按钮
UIButton *btn = self.subviews[i];
btn.tag = i; //设置按钮的标记, 方便来索引当前的按钮,并跳转到相应的视图
CGFloat x = i * self.bounds.size.width / count;
CGFloat y = 0;
CGFloat width = self.bounds.size.width / count;
CGFloat height = self.bounds.size.height;
btn.frame = CGRectMake(x, y, width, height);
}
}
/**
* 自定义TabBar的按钮点击事件
*/
- (void)clickBtn:(UIButton *)button {
//1.先将之前选中的按钮设置为未选中
self.selectedBtn.selected = NO;
//2.再将当前按钮设置为选中
button.selected = YES;
//3.最后把当前按钮赋值为之前选中的按钮
self.selectedBtn = button;
//却换视图控制器的事情,应该交给controller来做
//最好这样写, 先判断该代理方法是否实现
if ([self.delegate respondsToSelector:@selector(tabBar:selectedFrom:to:)]) {
[self.delegate tabBar:self selectedFrom:self.selectedBtn.tag to:button.tag];
}
//4.跳转到相应的视图控制器. (通过selectIndex参数来设置选中了那个控制器)
}
@end