原理:TabBar本身是一個View会油,自定義一個繼承TabBar的uiview锌仅,然后替換掉原來的TabBar
下面直接上代碼,直接復(fù)制的代碼穿铆,可能出現(xiàn)錯誤,最下方有截圖
自定義的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;
/**
* 傳普通狀態(tài)和選中狀態(tài)的圖片悴务,內(nèi)部就幫你添加一個按鈕
*/
-(void)addTabbarBtnWithNormalImg:(NSString *)normalImg selImg:(NSString *)selImg;
@end
//自定義按鈕睹限,主要是為了去掉Tabbar按鈕的高亮狀態(tài)
@interface CZTabbarButton : UIButton
@end
自定義的TabBar譬猫,WDYTabbar.m文件
#import "WDYTabbar.h"
@interface WDYTabbar ()
/**
* 當(dāng)前選中的按鈕
*/
@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];
//監(jiān)聽事件
[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchDown];
//綁定tag
#warning tag綁定要在addSubview的方法之前
btn.tag = self.subviews.count;
[self addSubview:btn];
//設(shè)置默認選中
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];
//
//? ? ? ? //設(shè)置按鈕的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 開發(fā)過程,首先針對64位開發(fā)染服,蘋果開發(fā)的應(yīng)用上架别洪,必需支持64位
//? ? NSLog(@"%ld",btn.tag);
//
//取消之前選中
self.selectedBtn.selected = NO;
//設(shè)置當(dāng)前選中
btn.selected = YES;
self.selectedBtn = btn;
}
@end
//實現(xiàn)自定義的btn
@implementation CZTabbarButton
//圖片高亮?xí)r候會調(diào)用這個方法
-(void)setHighlighted:(BOOL)highlighted{
//? ? NSLog(@"%s",__func__);
//只要不調(diào)用父類的方法,按鈕就不會有高度的效果
//[super setHighlighted:highlighted];
}
@end
自定義的TabBar的使用
#import
@interface MainViewController : UITabBarController
@end
#import "MainViewController.h"
@interface MainViewController ()
@end
@implementation MainViewController
- (void)viewDidLayoutSubviews{
//? ? NSLog(@"%s",__func__);
//此方法在創(chuàng)建每個子View時都會調(diào)用柳刮,此類中調(diào)用兩次挖垛,下方代碼只需要一次
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"];
//設(shè)置代理
wDYTabbar.delegate = self;
//把自定義的tabbar添加到 系統(tǒng)的tabbar上
[self.tabBar addSubview:wDYTabbar];
});
}
此處的方法可參照修改UITabBarController的Tabbar高度
同樣下方有完整截圖
自定義的TabBar,WDYTabbar.h截圖
自定義的TabBar秉颗,WDYTabbar.m截圖
自定義的TabBar的使用
如有不懂的可以留言&私信