TabBar的使用詳解

現(xiàn)如今大多數(shù)的app都會用到tabbar,然后tabbar的創(chuàng)建卻是各種各樣的。下面來做個總結(jié)。閑話不多說,直接上代碼。

一、利用系統(tǒng)自帶的tabbar

首先先設(shè)置圖片,圖片必須得經(jīng)過UIImageRenderingModeAlwaysOriginal處理,否則圖片在選中情況下會被系統(tǒng)渲染,改成藍色。

    // 五套圖片
    UIImage *homepageImage = [UIImage imageNamed:@"tab_home"];
    UIImage *homepageImageSelected = [UIImage imageNamed:@"tab_home_sel"];
    homepageImage = [homepageImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    homepageImageSelected = [homepageImageSelected imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    
    UIImage *collectionImage = [UIImage imageNamed:@"tab_collect"];
    UIImage *collectionImageSelected = [UIImage imageNamed:@"tab_collect_sel"];
    collectionImage = [collectionImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    collectionImageSelected = [collectionImageSelected imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    
    UIImage *messageImage = [UIImage imageNamed:@"tab_message"];
    UIImage *messageImageSelected = [UIImage imageNamed:@"tab_message_sel"];
    messageImage = [messageImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    messageImageSelected = [messageImageSelected imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    
    UIImage *personalImage = [UIImage imageNamed:@"tab_me"];
    UIImage *personalImageSelected = [UIImage imageNamed:@"tab_me_sel"];
    personalImage = [personalImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    personalImageSelected = [personalImageSelected imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    
    UIImage *searchImage = [UIImage imageNamed:@"tab_search"];
    UIImage *searchImageSelected = [UIImage imageNamed:@"tab_search_sel"];
    searchImage = [searchImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    searchImageSelected = [searchImageSelected imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

接下去設(shè)置tabbar的自控制器以及屬性,最后添加。舉例:

    /*首頁*/
    SKNavigationController *home = [[SKNavigationController alloc] initWithRootViewController:[[SKHomeViewController alloc] init]];
    [self setupChildControllerWith:home normalImage:homepageImage selectedImage:homepageImageSelected title:@"首頁"];

為了方便可以自己寫一個方法來完成這個任務(wù)。

- (void)setupChildControllerWith:(UIViewController *)childViewController normalImage:(UIImage *)normalImage selectedImage:(UIImage *)selectedImage title:(NSString *)title
{
    childViewController.tabBarItem.title = title;
    childViewController.tabBarItem.image = normalImage;
    childViewController.tabBarItem.selectedImage = selectedImage;
    
    [self addChildViewController:childViewController];
}

效果如圖

屏幕快照 2016-09-19 下午9.32.45.png

仔細看會發(fā)現(xiàn)一個問題,那就是首頁選中的時候,字體的顏色和app的風(fēng)格顏色不一致,不美觀,解決這個問題的方法是添加以下代碼

[[UITabBarItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor blackColor], NSForegroundColorAttributeName, nil] forState:UIControlStateNormal];
    
[[UITabBarItem appearance] setTitleTextAttributes:
[NSDictionary dictionaryWithObjectsAndKeys:[UIColor redColor],NSForegroundColorAttributeName, nil]forState:UIControlStateSelected];

效果圖:


屏幕快照 2016-09-19 下午9.33.09.png

顯然根據(jù)代碼也可知道同時可以更改字體大小之類的其他屬性
然而有些小清新的app不需要下面的label,直接是一個圖標(biāo),例如這樣:

屏幕快照 2016-09-19 下午9.34.05.png

解決方法就是修改下面的方法并不傳title屬性

- (void)setupChildControllerWith:(UIViewController *)childViewController normalImage:(UIImage *)normalImage selectedImage:(UIImage *)selectedImage title:(NSString *)title
{
    childViewController.tabBarItem.title = title;
    childViewController.title = title;
    childViewController.tabBarItem.image = normalImage;
    childViewController.tabBarItem.selectedImage = selectedImage;
// 加一行,移動image的位置
    childViewController.tabBarItem.imageInsets = UIEdgeInsetsMake(7.0, 0, - 7.0, 0);
    
    [self addChildViewController:childViewController];
}

二、利用數(shù)組的enumerateObjectsUsingBlock方法設(shè)置tabbar屬性

代碼如下

NSArray *childItemsArray = @[
                                 @{kClassKey  : @"MXHomeViewController",
                                   kTitleKey  : @"首頁",
                                   kImgKey    : @"tab_button_home_nor",
                                   kSelImgKey : @"tab_button_home_sel"},
                                 
                                 @{kClassKey  : @"MXMapViewController",
                                   kTitleKey  : @"地圖",
                                   kImgKey    : @"tab_button_map_nor",
                                   kSelImgKey : @"tab_button_map_sel"},
                                 
                                 @{kClassKey  : @"MXTimeLineViewController",
                                   kTitleKey  : @"行圈",
                                   kImgKey    : @"tab_button_discover_nor",
                                   kSelImgKey : @"tab_button_discover_sel"},
                                 
                                 @{kClassKey  : @"MXMineViewController",
                                   kTitleKey  : @"我的",
                                   kImgKey    : @"tab_button_me_nor",
                                   kSelImgKey : @"tab_button_me_sel"} ];
    
    [childItemsArray enumerateObjectsUsingBlock:^(NSDictionary *dict, NSUInteger idx, BOOL *stop) {
        UIViewController *vc = [NSClassFromString(dict[kClassKey]) new];
        vc.title = dict[kTitleKey];
        MXBaseNavigationController *nav = [[MXBaseNavigationController alloc] initWithRootViewController:vc];
        UITabBarItem *item = nav.tabBarItem;
        item.title = dict[kTitleKey];
        item.image = [UIImage imageNamed:dict[kImgKey]];
        item.selectedImage = [[UIImage imageNamed:dict[kSelImgKey]] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        [item setTitleTextAttributes:@{NSForegroundColorAttributeName : Global_tintColor} forState:UIControlStateSelected];
        [self addChildViewController:nav];
    }];

當(dāng)然,kClassKey等四個是我自己寫的宏。

三、自定義tabbar

首先新建一個tabbar,繼承自UITabBar,然后在tabbar上add需要的按鈕來充當(dāng)tabbarButton

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        UIButton *leftViewBtn = [[UIButton alloc] init];
        [leftViewBtn setTitle:@"鑰匙" forState:UIControlStateNormal];
        [leftViewBtn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
        [leftViewBtn setTitleColor:[UIColor orangeColor] forState:UIControlStateHighlighted];
        [leftViewBtn addTarget:self action:@selector(buttonDidClick:) forControlEvents:UIControlEventTouchUpInside];
        leftViewBtn.tag = 0;
        [self addSubview:leftViewBtn];
        self.leftViewBtn = leftViewBtn;
    
        UIButton *openBtn = [[UIButton alloc] init];
        [openBtn setTitle:@"開鎖" forState:UIControlStateNormal];
        [openBtn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
        [openBtn setTitleColor:[UIColor orangeColor] forState:UIControlStateSelected];
        [openBtn addTarget:self action:@selector(buttonDidClick:) forControlEvents:UIControlEventTouchUpInside];
        openBtn.tag = 1;
        [self addSubview:openBtn];
        self.openBtn = openBtn;
    
        UIButton *shareBtn = [[UIButton alloc] init];
        [shareBtn setTitle:@"分享" forState:UIControlStateNormal];
        [shareBtn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
        [shareBtn setTitleColor:[UIColor orangeColor] forState:UIControlStateSelected];
        [shareBtn addTarget:self action:@selector(buttonDidClick:) forControlEvents:UIControlEventTouchUpInside];
        shareBtn.tag = 2;
        [self addSubview:shareBtn];
        self.shareBtn = shareBtn;
    }
    return self;
}

在layoutSubviews里面重寫位置

- (void)layoutSubviews
{
    [super layoutSubviews];
    [self setTabBarButtonFrame];
    [self setleftViewBtnFrame];
}

//設(shè)置所有TabbarItem的frame
- (void)setTabBarButtonFrame
{
        //遍歷所有的button
        for (UIView *tabbarButton in self.subviews) {
            if (![tabbarButton isKindOfClass:NSClassFromString(@"UITabBarButton")]) continue;
            // 隱藏系統(tǒng)的tabbarButton
            tabbarButton.hidden  = YES;
        }
    
}

//設(shè)置leftViewBtn的frame
- (void)setleftViewBtnFrame
{
    self.leftViewBtn.frame = CGRectMake(0, 0, self.width/3, self.height);
    self.openBtn.frame = CGRectMake(self.width/3, 0, self.width/3, self.height);
    self.shareBtn.frame = CGRectMake(self.width/3 + self.width/3, 0, self.width/3, self.height);
}

這樣,自定義的tabbar就完成了,回到tabbarController中,更改tabbar

    YQTabBarView *tabbar = [[YQTabBarView alloc] init];
    tabbar.tabBarDelegate = self;
    [self setValue:tabbar forKeyPath:@"tabBar"];

當(dāng)然,由于是自定義的,所以我們需要寫代理方法,這樣才能使控制器知道點了哪一個按鈕,才能切換相應(yīng)的控制器。
代理方法以及點擊按鈕回應(yīng)如下

@class YQTabBarView;
@protocol YQTabBarViewDelegate <NSObject>
- (void)tabBar:(YQTabBarView *)tabBar didSelectButtonFrom:(NSUInteger)from to:(NSUInteger)to;
@end

- (void)buttonDidClick:(UIButton *)btn
{
    // 如果按到的是鑰匙,
        if ([self.tabBarDelegate respondsToSelector:@selector(tabBar:didSelectButtonFrom:to:)]) {
            [self.tabBarDelegate tabBar:self didSelectButtonFrom:self.selecedBtn.tag to:btn.tag];
        }
        self.selecedBtn.selected = NO;
        btn.selected = YES;
        self.selecedBtn = btn;
    }
}

效果如下,可以加上圖片然后更改按鈕的image和titlelabel的位置

屏幕快照 2016-09-19 下午10.16.56.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,486評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,462評論 2 378

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,721評論 25 708
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,170評論 4 61
  • 上學(xué)的時候,我曾經(jīng)想試著交往過一個女朋友。有一天我半夜從夢中醒來,突然無比的想她。那時候手機還沒有像現(xiàn)在這...
    余平的余_余平的平閱讀 2,547評論 0 1