TabBar的使用详解

现如今大多数的app都会用到tabbar,然后tabbar的创建却是各种各样的。下面来做个总结。闲话不多说,直接上代码。

一、利用系统自带的tabbar

首先先设置图片,图片必须得经过UIImageRenderingModeAlwaysOriginal处理,否则图片在选中情况下会被系统渲染,改成蓝色。

    // 五套图片
    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];

接下去设置tabbar的自控制器以及属性,最后添加。举例:

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

为了方便可以自己写一个方法来完成这个任务。

- (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

仔细看会发现一个问题,那就是首页选中的时候,字体的颜色和app的风格颜色不一致,不美观,解决这个问题的方法是添加以下代码

[[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

显然根据代码也可知道同时可以更改字体大小之类的其他属性
然而有些小清新的app不需要下面的label,直接是一个图标,例如这样:

屏幕快照 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];
}

二、利用数组的enumerateObjectsUsingBlock方法设置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];
    }];

当然,kClassKey等四个是我自己写的宏。

三、自定义tabbar

首先新建一个tabbar,继承自UITabBar,然后在tabbar上add需要的按钮来充当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];
}

//设置所有TabbarItem的frame
- (void)setTabBarButtonFrame
{
        //遍历所有的button
        for (UIView *tabbarButton in self.subviews) {
            if (![tabbarButton isKindOfClass:NSClassFromString(@"UITabBarButton")]) continue;
            // 隐藏系统的tabbarButton
            tabbarButton.hidden  = YES;
        }
    
}

//设置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"];

当然,由于是自定义的,所以我们需要写代理方法,这样才能使控制器知道点了哪一个按钮,才能切换相应的控制器。
代理方法以及点击按钮回应如下

@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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 上学的时候,我曾经想试着交往过一个女朋友。有一天我半夜从梦中醒来,突然无比的想她。那时候手机还没有像现在这...
    余平的余_余平的平阅读 2,537评论 0 1