iOS 自定義 TabBarController

產(chǎn)品:" tabBar 上要6個(gè)標(biāo)簽欄"
"iOS 官方設(shè)置,最多有5個(gè).而且6個(gè)用戶體驗(yàn)不太好"
"安卓那邊可以,你跟進(jìn)一下"
so,你需要自定義 tabBar

設(shè)置類似于微博的 tabBar

  • 自定義 tabBarController ,定義4個(gè)VC,添加到 tabBarController 中
- (void)creatAddVC:(UIViewController *)vc title:(NSString *)title imgName:(NSString *)imgName{
    
    vc.title = title;
    vc.tabBarItem.image = [[UIImage imageNamed:imgName]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    NSString *selImgName = [NSString stringWithFormat:@"%@_sel",imgName];
    vc.tabBarItem.selectedImage = [[UIImage imageNamed:selImgName]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal
                                   ];
    UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:vc];
    
    [self addChildViewController:nav];
}
  • 自定義一個(gè)繼承自 UITabBar 的 TabBar,通過KVC,將該自定義的 tabBar 設(shè)置為 tabBarController 的 tabBar
    // 將代碼放在 viewDidLoad中
    UIViewController *vc4 = [UIViewController new];
    vc4.view.backgroundColor = [UIColor purpleColor];
    [self creatAddVC:vc4 title:@"我" imgName:@"me"];

    HSTabBar *customTabBar = [HSTabBar new];
    customTabBar.delegate = self;
    // KVC
    [self setValue:customTabBar forKeyPath:@"tabBar"];
  • 在自定義的 tabBar 加入一個(gè)額外的加號按鈕,并對 tabBarItem和加號按鈕重新布局
//  layoutsubViews中重新布局,并添加'+'按鈕,
- (void)layoutSubviews{
    [super layoutSubviews];
    
    CGFloat width = self.frame.size.width / 5.0;
    CGFloat height = self.frame.size.height;
    
    int idx = 0;
    for (UIView *subView in self.subviews) {
        if (subView.class != NSClassFromString(@"UITabBarButton")) {
            continue;
        }
        if (idx <2) {
            subView.frame = CGRectMake(width * idx, 0, width, height);
        }else if(idx >= 2){
            subView.frame = CGRectMake(width * idx + width, 0, width, height);
        }
        idx++;
    }
    
    UIButton *addBtn = [UIButton new];
    [addBtn setImage:[UIImage imageNamed:@"add"] forState:UIControlStateNormal];
    [addBtn setImage:[UIImage imageNamed:@"add"] forState:UIControlStateHighlighted];
    [addBtn addTarget:self action:@selector(addClick) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:addBtn];
    addBtn.frame = CGRectMake(width * 2, 0, width, height);
}

// 這里使用代理進(jìn)行點(diǎn)擊回調(diào)
- (void)addClick{
    if ([self.delegate respondsToSelector:@selector(click2Add)]) {
        [self.delegate click2Add];
    }
}

含有6個(gè)標(biāo)簽的 tabBar

用上述的方法確實(shí)可以實(shí)現(xiàn)一些自定義 tabBar 的需求,但是受限與蘋果方法的限制,這還不能顯示標(biāo)簽,無法達(dá)到產(chǎn)品的需求.所以,上述辦法不可用.這里介紹另一個(gè)簡單的方法方法:

  • 寫一個(gè)自定義的tabBarController ,添加6個(gè) VC
_vcArr = @[vc1 , vc2, vc3, vc4, vc5, vc6];
    for (UIViewController *vc in _vcArr) {
        UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:vc];
        [self addChildViewController:nav];
    }
    self.selectedIndex = 0;
  • 定一個(gè)繼承自 UIView 的 tabBarView,將這個(gè) tabBarView 添加到自定義的 tabBarController 上
SSBarView *barView = [[SSBarView alloc]initWithFrame:self.tabBar.bounds];
    self.barView = barView;
    [self.tabBar addSubview:barView];
    barView.delegate = self;
  • 在定義的 tabBarView 中,設(shè)置6個(gè)按鈕,按照要求布局好
- (void)creatUI{
    
    self.userInteractionEnabled = YES;
    self.backgroundColor = [UIColor orangeColor];
    NSArray *arr = @[@"我", @"是", @"中", @"國", @"人", @"民"];
    
    CGFloat btnW = self.frame.size.width / arr.count;
    CGFloat btnH = self.frame.size.height;
    for (NSString *text in arr) {
        NSUInteger idx = [arr indexOfObject:text];
        UIButton *btn = [UIButton new];
        [self addSubview:btn];
        btn.frame = CGRectMake(btnW * idx, 0, btnW, btnH);
        btn.tag = tagId + idx;
        [btn setTitle:text forState:UIControlStateNormal];
        [btn setTitle:text forState:UIControlStateSelected];
        [btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
        [self.btnArr addObject:btn];
    }
}
  • 通過代理或者 block 回調(diào),在點(diǎn)擊某個(gè)按鈕的時(shí)候,tabBarController 切換不同的 selectedIndex
// BarView 的代理
- (void)click2GetIndex:(int)index{
    self.selectedIndex = index;
}

具體的請參考:demo

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

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