原理:TabBar本身是一个View,自定义一个继承TabBar的uiview,然后替换掉原来的TabBar
下面直接上代码,直接复制的代码,可能出现错误,最下方有截图
自定义的TabBar,WDYTabbar.h文件
#import
@class WDYTabbar;
@protocol WDYTabbarDelegate
- (void)tabbar:(WDYTabbar *)tabbar didSelectedFrom:(NSInteger)from to:(NSInteger)to;
@end
@interface WDYTabbar : UIView
@property (nonatomic, weak) iddelegate;
/**
* 传普通状态和选中状态的图片,内部就帮你添加一个按钮
*/
-(void)addTabbarBtnWithNormalImg:(NSString *)normalImg selImg:(NSString *)selImg;
@end
//自定义按钮,主要是为了去掉Tabbar按钮的高亮状态
@interface CZTabbarButton : UIButton
@end
自定义的TabBar,WDYTabbar.m文件
#import "WDYTabbar.h"
@interface WDYTabbar ()
/**
* 当前选中的按钮
*/
@property (nonatomic, weak) UIButton *selectedBtn;
@end
@implementation WDYTabbar
/*
*自定义控件
1.在initWithFrame初始化的方法,添加子控件
2.layoutSubviews 布局子控件frm
*/
- (instancetype)initWithFrame:(CGRect)frame{
// NSLog(@"%lf, %lf, %lf, %lf,", frame.origin.x, frame.origin.y, frame.size.width, frame.size.height);
//
if (self = [super initWithFrame:frame]) {
// self.backgroundColor = [UIColor grayColor];
self.backgroundColor = [UIColor colorWithRed:192/255 green:192/255 blue:192/255 alpha:0.4];
}
return self;
}
#pragma mark 初始化按钮
-(void)addTabbarBtnWithNormalImg:(NSString *)normalImg selImg:(NSString *)selImg{
UIButton *btn = [CZTabbarButton buttonWithType:UIButtonTypeCustom];
[btn setBackgroundImage:[UIImage imageNamed:normalImg] forState:UIControlStateNormal];
[btn setBackgroundImage:[UIImage imageNamed:selImg] forState:UIControlStateSelected];
//监听事件
[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchDown];
//绑定tag
#warning tag绑定要在addSubview的方法之前
btn.tag = self.subviews.count;
[self addSubview:btn];
//设置默认选中
if (btn.tag == 0) {
// btn.selected = YES;
// self.selectedBtn = btn;
[self btnClick:btn];
}
}
-(void)layoutSubviews{
[super layoutSubviews];
NSInteger count = self.subviews.count;
//布局子控件
//按钮宽度与高度
CGFloat btnW = 80;
CGFloat btnH = self.bounds.size.height-10;
CGFloat initialX = self.bounds.size.width/4 + 50;
//自定义的tabbar添加5个按钮
// for (NSInteger i = 0; i < count; i++) {
//
// //获取btn
// UIButton *btn = self.subviews[i];
//
// //设置按钮的frm
// btn.frame = CGRectMake(btnW * i, 0, btnW, btnH);
//
// }
for (UIButton *btn in self.subviews) {
CGFloat btnIntX = (btnW+20) * btn.tag + initialX;
btn.frame = CGRectMake(btnIntX, 10.0, btnW, btnH);
}
}
-(void)btnClick:(UIButton *)btn{
//一点击通知代理
if ([self.delegate respondsToSelector:@selector(tabbar:didSelectedFrom:to:)]) {
[self.delegate tabbar:self didSelectedFrom:self.selectedBtn.tag to:btn.tag];
}
//#warning 开发过程,首先针对64位开发,苹果开发的应用上架,必需支持64位
// NSLog(@"%ld",btn.tag);
//
//取消之前选中
self.selectedBtn.selected = NO;
//设置当前选中
btn.selected = YES;
self.selectedBtn = btn;
}
@end
//实现自定义的btn
@implementation CZTabbarButton
//图片高亮时候会调用这个方法
-(void)setHighlighted:(BOOL)highlighted{
// NSLog(@"%s",__func__);
//只要不调用父类的方法,按钮就不会有高度的效果
//[super setHighlighted:highlighted];
}
@end
自定义的TabBar的使用
#import
@interface MainViewController : UITabBarController
@end
#import "MainViewController.h"
@interface MainViewController ()
@end
@implementation MainViewController
- (void)viewDidLayoutSubviews{
// NSLog(@"%s",__func__);
//此方法在创建每个子View时都会调用,此类中调用两次,下方代码只需要一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
CGRect frame = CGRectMake(0
, self.tabBar.frame.origin.y-41
, self.tabBar.frame.size.width
, 90);
self.tabBar.frame = frame;
WDYTabbar *wDYTabbar = [[WDYTabbar alloc] initWithFrame:self.tabBar.bounds];
//添加五个按钮
[wDYTabbar addTabbarBtnWithNormalImg:@"lights0" selImg:@"lights1"];
[wDYTabbar addTabbarBtnWithNormalImg:@"aircon0" selImg:@"aircon1"];
[wDYTabbar addTabbarBtnWithNormalImg:@"service0" selImg:@"service1"];
[wDYTabbar addTabbarBtnWithNormalImg:@"setting0" selImg:@"setting1"];
//设置代理
wDYTabbar.delegate = self;
//把自定义的tabbar添加到 系统的tabbar上
[self.tabBar addSubview:wDYTabbar];
});
}
此处的方法可参照修改UITabBarController的Tabbar高度
同样下方有完整截图
自定义的TabBar,WDYTabbar.h截图
自定义的TabBar,WDYTabbar.m截图
自定义的TabBar的使用
如有不懂的可以留言&私信