使用 RDVTabBarController 制作底部凸起的 TabBar教程

本文主要针对底部凸起的 TabBar 这种特殊需求,不感兴趣的可以直接绕过~

最近做的一个项目需要底部凸起的 TabBar,效果如下:

考虑到 iOS 原生UITableBar的定制比较麻烦,所以决定先找一下第三方的解决方案,经过调研发现RDVTabBarController比较符合需求。而且经过实践发现它有如下几个优势:

实现方式与 iOS 原生UITableBarController基本一致,方便上手。RDVTabBar可以比较简单滴实现底部某个 tab 凸起的效果。支持自定义 badge。

切图

因为RDVTabBarItem本身提供如下支持:

设置选中和未选中的背景设置选中和未选中的 Image 设置选中和未选中的文本属性

而且考虑到屏幕的自适应,所以我们在切图的时候把 tab 的 icon 和背景(背景如果是纯色可以不切图)单独切图。

撸代码

首先,我们新建一个继承RDVTabBarController的类,然后通过代码或者SB的方式将其设置为根视图。

巨坑

这里有我之前踩过的一个坑,因为一般 App 都会有UINavigationController用来做视图导航,所以当 App 底部有 TabBar 的时候,我们有两种选择:

用一个UITabBarController包含多个UINavigationController。用一个UINavigationController包含一个UITabBarController。

曾经我很天真(sha bi)的选了第一种,理由是从逻辑上理解更自然,但是结果是被坑惨了,因为业务需求往往是底部UITabBar只在几个 Tab 的首页显示,进入下一个页面之后就要隐藏起来,如果采用了第一种方案,你就需要使用self.hidesBottomBarWhenPushed = YES或者自定义动画的方式来隐藏底部UITabBar,然后坑就出现了——当你需要从某个 Tab 的首页渐变到下一个页面的时候。

如果使用self.hidesBottomBarWhenPushed = YES,UITabBar仍然会按照原来动画方式隐藏和出现,也就是你会看到 Push 的时候它从右往左消失,Pop 的时候从左往右出现,OMG!!!这 tmd 能看么?你的切换动画是渐变的,但是竟然有个UITabBar在下面跑来跑去,不能忍好么?

这个时候是不是想自定义动画了?呵呵~不敢告诉你我试了好久,也没有得到一种可以让UITabBar渐变消失出现,然后 Tab 里面的页面还能平滑滴配合UITabBar做变化的动画效果。

所以!为什么不选第二种!在也不需要self.hidesBottomBarWhenPushed = YES!再也不需要为隐藏和显示UITabBar头疼!再也不需要搞各种动画来处理这个巨坑,你所需要做的只是:在 Tab 页面切换的时候把导航栏的标题换一下而已。So easy!

言归正传

好了,骂完以前天真(sha bi)的日子,感觉爽多了~现在继续定制 TabBar。

首先,和UITableBarController一样,先设置TabBarController管理的viewControllers:

UIStoryboard *homeStoryboard = [UIStoryboard storyboardWithName:WDHOMESTORYBOARD bundle:nil];

UIViewController *firstViewController=[homeStoryboard instantiateViewControllerWithIdentifier:WDHOMEVIEWCONTROLLER];

UIStoryboard *clothStoryboard = [UIStoryboard storyboardWithName:WDCLOTHSTORYBOARD bundle:nil];

UIViewController *secondViewController=[clothStoryboard instantiateViewControllerWithIdentifier:WDCLOTHVIEWCONTROLLER];

UIStoryboard *userStoryboard = [UIStoryboard storyboardWithName:WDUSERSTORYBOARD bundle:nil];

UIViewController *thirdViewController=[userStoryboard instantiateViewControllerWithIdentifier:WDLOGINVIEWCONTROLLER];

[self setViewControllers:@[firstViewController, secondViewController,

thirdViewController]];

代码很简单,就是从 SB 中加载 3 个ViewController然后放到viewControllers里面去。

然后是关键部分,对 TabBar 做定制:

self.tabBar.frame = CGRectMake(0, 0, SCREEN_SIZE.width, 68);

self.tabBar.backgroundColor = [UIColor clearColor];

// tab 图片

NSArray *tabBarItemImages = @[@"home_icon", @"cloth_icon", @"cloud_icon"];

// tab 标题

NSArray *tabBarItemTitles = @[@"首页", @"", @"云同步"];

NSInteger index = 0;

for (RDVTabBarItem *item in [[self tabBar] items])

{

if (index == 1) {

[item setBackgroundSelectedImage:[UIImage imageNamed:@"tabbar_bg_image"] withUnselectedImage:[UIImage imageNamed:@"tabbar_bg_image"]];

} else {

[item setBackgroundSelectedImage:[WDImageUtil createImageWithColor:TINT_COLOR] withUnselectedImage:[WDImageUtil createImageWithColor:DARK_COLOR]];

item.itemHeight = 57.0f;

}

UIImage *selectedimage = [UIImage imageNamed:[NSString stringWithFormat:@"%@_selected",[tabBarItemImages objectAtIndex:index]]];

UIImage *unselectedimage = [UIImage imageNamed:[NSString stringWithFormat:@"%@",[tabBarItemImages objectAtIndex:index]]];

[item setFinishedSelectedImage:selectedimage withFinishedUnselectedImage:unselectedimage];

[item setTitle:[tabBarItemTitles objectAtIndex:index]];

item.selectedTitleAttributes = @{

NSFontAttributeName: [UIFont boldSystemFontOfSize:12],

NSForegroundColorAttributeName:[UIColor whiteColor],

};

item.unselectedTitleAttributes = @{

NSFontAttributeName: [UIFont boldSystemFontOfSize:12],

NSForegroundColorAttributeName:[UIColor whiteColor],

};

index++;

}

这里我做了几件事情:

设置tabBar的frame,设置其高度为凸出 Tab 按钮的高度,如果不设置的话,凸出 Tab 按钮会被裁剪掉,如下图:

vc+52Lz8tcS149Ta09rF0LbPysfV/dbQvOS1xCA8Y29kZT5pdGVtPC9jb2RlPiDKsaOsztLDx9Do0qrJ6NbDy/y1xLGzvrDNvMaszqrKws/Ix9C6w7XEsci9z8zYyuK1xM28xqyjrNXi1cXNvMastcS31rHmwsrOqiAxKjY4o6g2OLy0zqogPGNvZGU+dGFiQmFyPC9jb2RlPiC1xLjftsijqaOsyLu688v8tcTJz8Pm0ruyv7fWysfNuMP3tcSjrM/Cw+bSu7K/t9bM7rPk0dXJq6Osz8LD5tK7sr+31rXEuN+2yM6qIDU3o6zV4rj2uN+2yLrNwe3N4iA8Y29kZT5pdGVtPC9jb2RlPiC1xCA8Y29kZT5pdGVtSGVpZ2h0PC9jb2RlPiDKx9K71sK1xKGj1eK49iA8Y29kZT5pdGVtSGVpZ2h0PC9jb2RlPiC1xNf308PT0MG9uPajujwvcD4NCsno1sPV/bOjIDxjb2RlPml0ZW08L2NvZGU+ILXEuN+2yKOs1eK49rjftsjSu7DjscjNubP2IFRhYiCwtMWltcS437bI0qrQoaOous3WrsewzNjK4s28xqzF5LrPo6zV4rj21K3A7cDtveLPwtOmuMO+zbvhtq6jqaGjDQo8cD7KuSBUYWIg0aHP7tbQtcTSs8Pmz9TKvtX9s6OjrMjnufuyu8no1sPV4rj21rWjrFRhYiDRoc/u1tC1xNKzw+bWu7vhzO6z5LW9zbmz9iBUYWIgsLTFpbalsr+1xM671sOjrNXi0fm+zbvhtObU2tbQvOTB9LDXtcTH6b/2oaPI58/CzbyjujwvcD4NCjxwPjxpbWcgYWx0PQ=="这里写图片描述" src="http://www.2cto.com/uploadfile/Collfiles/20160226/2016022609161688.jpg" title="" />

这样设置好之后就可以达到文章开始时的效果了。

唯一不足就是中间凸起按钮的背景图片用了一个比较猥琐的办法。如果大家有更科学的办法可以通过下面的评论告诉我~

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

推荐阅读更多精彩内容