自定義標(biāo)簽控制器

#import "AppDelegate.h"

#import "CRITabBarController.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

/*————————————————————————————————————————————————————————————————————————*/

NSMutableArray *viewControllers = [NSMutableArray array];

NSArray *titles = @[@"主頁",@"信息",@"購票",@"發(fā)現(xiàn)",@"商店"];

NSArray *imgNames = @[@"home",@"myinfo",@"payticket",@"discover",@"store"];

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

//假設(shè) 2個(gè)導(dǎo)航控制器 3個(gè)視圖控制器

UIViewController *viewController = nil;

UIViewController *vc = [[UIViewController alloc]init];

vc.title = titles[i];

vc.tabBarItem.image = [UIImage imageNamed:imgNames[i]];

vc.tabBarItem.selectedImage = [UIImage imageNamed:[NSString stringWithFormat:@"%@_on",imgNames[i]]];

vc.view.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];

viewController = vc;

if (i<2) {

UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:vc];

viewController = nav;

}

[viewControllers addObject:viewController];

}

//標(biāo)簽

CRITabBarController *tabbar = [[CRITabBarController alloc]init];

tabbar.tabBar.selectionIndicatorImage = [UIImage imageNamed:@"選中"];

tabbar.tabBar.backgroundImage = [UIImage imageNamed:@"tab_bg_all"];

tabbar.viewControllers = viewControllers;

tabbar.selectedIndex = 3;

self.window.rootViewController = tabbar;

return YES;

}


#import//自定義的標(biāo)簽控制器類

@interface CRITabBarController : UITabBarController

@end

//自定義的垂直button類

@interface VerticalButton : UIButton

@end


#import "CRITabBarController.h"#define kTabBarWidth self.tabBar.frame.size.width#define kTabBarHeight self.tabBar.frame.size.height#define kButtonWidth kTabBarWidth/self.viewControllers.count@interface CRITabBarController (){? ? UIImageView *_selectImgV;}@property (nonatomic,strong) NSMutableArray *tabBarButtons;@end@implementation CRITabBarController- (instancetype)init{? ? self = [super init];? ? if (self) {? ? ? ? _tabBarButtons = [NSMutableArray array];? ? }? ? return self;}- (void)viewWillAppear:(BOOL)animated{? ? ? ? [super viewWillAppear:animated];? ? ? ? /**? ? * 8.當(dāng)控制器的tabbar執(zhí)行 setSelectionIndicatorImage:方法的時(shí)候 我們才有的選中圖片? ? ? ? ? ? ? ? 但是我們無法進(jìn)入self.tabbar的文件內(nèi)部去復(fù)寫這個(gè)方法? ? ? ? ? ? 所以在控制器完全加載完成 即將顯示的時(shí)候創(chuàng)建,因?yàn)檫@時(shí)候,控制器個(gè)數(shù)+按鈕寬度+選中的控制器? ? ? ? 都確定了? ? */? ? ? ? //檢查是否有選中圖片? ? UIImage *selectionIndicatorImage = self.tabBar.selectionIndicatorImage;? ? ? ? //如果沒有 return 什么都不做? ? if (selectionIndicatorImage == nil)return;? ? ? ? ? ? //如果有圖片:創(chuàng)建選中圖片-> 圖片+frame? ? _selectImgV = [[UIImageView alloc]initWithImage:selectionIndicatorImage];? ? _selectImgV.frame = CGRectMake(self.selectedIndex * kButtonWidth, 0, kButtonWidth, kTabBarHeight);? ? [self.tabBar insertSubview:_selectImgV atIndex:0];? ? ? ? //將選中的button高亮? ? UIButton *selectButton = self.tabBarButtons[self.selectedIndex];? ? selectButton.selected = YES;? ? ? ? }/** *? 外部給本標(biāo)簽控制器 子控制器數(shù)組賦值的方法 */- (void)setViewControllers:(NSArray<__kindof UIViewController *> *)viewControllers{? ? ? ? [super setViewControllers:viewControllers];? ? ? ? /*————————————————————————————————————————————————————————————————————————*/? ? //1.標(biāo)簽控制器已經(jīng)有了N個(gè)子視圖控制器? ? ? ? for (UIView *subView in self.tabBar.subviews) {? ? ? ? //2.標(biāo)簽欄上創(chuàng)建的是 UITabBarButton ,這個(gè)類是內(nèi)部類,我們無法使用,所以移除原有按鈕? ? ? ? [subView removeFromSuperview];? ? }? ? ? ? //3.添加自定義按鈕? ? for (int i = 0; i標(biāo)簽項(xiàng)->圖片+標(biāo)題 ->用于button的圖片+標(biāo)題

UIImage *image = subVC.tabBarItem.image;

UIImage *selectImage = subVC.tabBarItem.selectedImage;

NSString *title = subVC.tabBarItem.title;

//4.普通button的圖片和標(biāo)題是水平排布的,不符合我們的要求,--->自定義垂直排布的button

[button setImage:image forState:UIControlStateNormal];

[button setImage:selectImage forState:UIControlStateSelected];

[button setTitle:title forState:UIControlStateNormal];

[self.tabBar addSubview:button];

[self.tabBarButtons addObject:button];//?將按鈕交給數(shù)組管理

//7.添加事件,將按鈕添加 切換視圖控制器的功能

[button addTarget:self action:@selector(selectedVC:) forControlEvents:UIControlEventTouchUpInside];

button.tag = 100+i;

}

}

/**

*? 點(diǎn)擊按鈕調(diào)用的方法

*/

- (void)selectedVC:(UIButton *)button{

//7.1 修改標(biāo)簽控制器的本身具有的 selectedIndex 完成切換功能

self.selectedIndex = button.tag -100;

//10.將除了選中的button之外的按鈕選中狀態(tài)改為no

for (UIButton *btn in self.tabBarButtons) {

btn.selected = NO;

}

button.selected = YES;

//9.切換控制器的 選中圖片動(dòng)畫

[UIView animateWithDuration:0.3 animations:^{

_selectImgV.frame = CGRectMake(self.selectedIndex * kButtonWidth, _selectImgV.frame.origin.y, _selectImgV.frame.size.width, _selectImgV.frame.size.height);

}];

}

- (void)viewDidLoad {

[super viewDidLoad];

}

@end

#pragma mark -- 垂直布局的Button

@interface VerticalButton ()

{

UILabel *_subLabel;//按鈕的標(biāo)題

UIImageView *_subImageView;//按鈕的圖片視圖

UIImage *_normalImg;//保存默認(rèn)圖片

UIImage *_selectImg;//保存選中圖片

}

@end

@implementation VerticalButton

- (instancetype)initWithFrame:(CGRect)frame

{

self = [super initWithFrame:frame];

if (self) {

//5. 創(chuàng)建子視圖 Label 上 + ImageView 下

_subLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height * 0.3)];

_subLabel.textAlignment = NSTextAlignmentCenter;

_subLabel.textColor = [UIColor whiteColor];

_subLabel.font = [UIFont systemFontOfSize:12];

[self addSubview:_subLabel];

_subImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, _subLabel.frame.size.height, frame.size.width, frame.size.height *0.7)];

_subImageView.contentMode = UIViewContentModeCenter;

[self addSubview:_subImageView];

}

return self;

}

//6.截獲button的 圖片和標(biāo)題 的賦值方法,將圖片和標(biāo)題用于 Label + ImageView

- (void)setSelected:(BOOL)selected{

[super setSelected:selected];

if (self.selected == YES) {

_subImageView.image = _selectImg;

}else{

_subImageView.image = _normalImg;

}

}

- (void)setImage:(UIImage *)image forState:(UIControlState)state{

if (state == UIControlStateNormal) {

//保存默認(rèn)圖片

_normalImg = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

[_subImageView setImage:_normalImg];

}else if (state == UIControlStateSelected){

//保存選中圖片

_selectImg = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

}

}

- (void)setTitle:(NSString *)title forState:(UIControlState)state{

if (state == UIControlStateNormal) {

//保存標(biāo)題

[_subLabel setText:title];

}

}

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缎谷,一起剝皮案震驚了整個(gè)濱河市球切,隨后出現(xiàn)的幾起案子梨熙,更是在濱河造成了極大的恐慌,老刑警劉巖器予,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡欧宜,警方通過查閱死者的電腦和手機(jī)辽俗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門疾渣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人崖飘,你說我怎么就攤上這事榴捡。” “怎么了朱浴?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵吊圾,是天一觀的道長达椰。 經(jīng)常有香客問我,道長街夭,這世上最難降的妖魔是什么砰碴? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮板丽,結(jié)果婚禮上呈枉,老公的妹妹穿的比我還像新娘。我一直安慰自己埃碱,他們只是感情好猖辫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著砚殿,像睡著了一般啃憎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上似炎,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天辛萍,我揣著相機(jī)與錄音,去河邊找鬼羡藐。 笑死贩毕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仆嗦。 我是一名探鬼主播辉阶,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瘩扼!你這毒婦竟也來了谆甜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤集绰,失蹤者是張志新(化名)和其女友劉穎规辱,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栽燕,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡罕袋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纫谅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炫贤。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖付秕,靈堂內(nèi)的尸體忽然破棺而出兰珍,到底是詐尸還是另有隱情,我是刑警寧澤询吴,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布掠河,位于F島的核電站亮元,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏唠摹。R本人自食惡果不足惜爆捞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望勾拉。 院中可真熱鬧煮甥,春花似錦、人聲如沸藕赞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斧蜕。三九已至双霍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間批销,已是汗流浹背洒闸。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留均芽,地道東北人丘逸。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像骡技,于是被迫代替她去往敵國和親鸣个。 傳聞我的和親對(duì)象是個(gè)殘疾皇子羞反,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容