代码地址如下:
http://www.demodashi.com/demo/11901.html

一、运行效果图

二、项目结构截图

三、主要API

我们主要关注的是TLTabBarController,相比较系统的UITabBarController来讲,它只增加了两个API。

@interface TLTabBarController : UITabBarController

/**
* 添加子控制器
*
* @param viewController 视图控制器
* @param actionBlock 切换事件,返回是否允许切换,默认nil
*/
- (void)addChildViewController:(UIViewController *)viewController actionBlock:(BOOL (^)())actionBlock; /**
* 添加突出的tabbarItem,点击事件在acitonBlock中指定
*
* @param systemTabBarItem 系统tabBarItem
* @param actionBlock 切换事件
*/
- (void)addPlusItemWithSystemTabBarItem:(UITabBarItem *)systemTabBarItem actionBlock:(void (^)())actionBlock; @end

四、程序实现

一行代码实现TLTabBarController接入

只需用TLTabBarController代替UITabBarController,即可实现TLTabBarController的接入。

//    UITabBarController *tabBarController = [[UITabBarController alloc] init];
TLTabBarController *tabBarController = [[TLTabBarController alloc] init];

基于系统原生控件封装

基于系统原生控件封装

基于系统原生控件封装

重说三,系统方法仍然可用。所以切换后,项目仍能完美运行。

自定义切换事件

在某些业务场景下,点击某个tab需要确认用户是否登录,TLTabBarController完美解决这一问题

 	// 1、创建一个vc
TLMessageViewController *vc3 = [[TLMessageViewController alloc] init];
UINavigationController *navC3 = [[UINavigationController alloc] initWithRootViewController:vc3]; // 2、将vc添加到tabBarController中,并设置自定义的响应事件
[tabBarController addChildViewController:navC3 actionBlock:^BOOL {
// 3、点击响应block,自己的业务逻辑
// 4、要跳转时,直接调用tabbarController API // 5、actionBlock返回NO代表,点击该item时,不允许直接跳转
return NO;
}];

添加凸出的发布按钮

直接看代码,非常简单

	// 1、创建一个系统的tabbarItem
UITabBarItem *addItem = [[UITabBarItem alloc] initWithTitle:@"发布" image:[UIImage imageNamed:@"publish"] selectedImage:[UIImage imageNamed:@"publish"]];
// 2、将item添加到 tabBarController
[tabBarController addPlusItemWithSystemTabBarItem:addItem actionBlock:^{
// 3、点击事件,弹出发布界面等
}];

可以通过修改item的偏移量,更改凸出的高度。

双击tabbarItem事件

双击事件是通过协议的方式,传递给该item所在的vc。

@protocol TLTabBarControllerProtocol <NSObject>

@optional;
/**
* tabBar被单击
*
* @param isSelected 是否已经选中
*/
- (void)tabBarItemDidClick:(BOOL)isSelected; /**
* tabBar被双击(仅在已选中时调用)
*/
- (void)tabBarItemDidDoubleClick; @end

所以,在对应VC实现TLTabBarControllerProtocol即可监听到双击事件。

详见代码

#import "TLMessageViewController.h"
#import "TLTabBarControllerProtocol.h"
#import "SVProgressHUD.h" @interface TLMessageViewController () <TLTabBarControllerProtocol> @property (nonatomic, strong) UIWebView *webView; @end @implementation TLMessageViewController - (void)loadView {
[super loadView];
[self setTitle:@"消息"]; [self.view setBackgroundColor:[UIColor orangeColor]]; self.webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:self.webView]; UIBarButtonItem *clearBadgeButton = [[UIBarButtonItem alloc] initWithTitle:@"消除红点" style:UIBarButtonItemStylePlain target:self action:@selector(clearBadgeButtonClick)];
[self.navigationItem setRightBarButtonItem:clearBadgeButton]; [self loadRequest];
} - (void)clearBadgeButtonClick
{
[self.tabBarItem setBadgeValue:nil];
} - (void)loadRequest
{
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.libokun.com"]]];
} #pragma mark - # TLTabBarControllerProtocol
- (void)tabBarItemDidDoubleClick
{
[SVProgressHUD showInfoWithStatus:@"正在刷新..."];
[self loadRequest];
} @end

支持tabbarItem红点

设置tabbarItem.badgeValue = @"";即可

支持仅图片模式

不设置title,tabBarItem居中显示图片

完美支持横屏

无需一行代码

五、其他补充

暂没UITabBarController超强拓展

代码地址如下:
http://www.demodashi.com/demo/11901.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

UITabBarController超强拓展的更多相关文章

  1. C++对C的函数拓展

    一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...

  2. RabbitMQ + PHP (二)AMQP拓展安装

    上篇说到了 RabbitMQ 的安装. 这次要在讲案例之前,需要安装PHP的AMQP扩展.不然可能会报以下两个错误. 1.Fatal error: Class 'AMQPConnection' not ...

  3. chrome拓展开发实战:页面脚本的拦截注入

    原文请访问个人博客:chrome拓展开发实战:页面脚本的拦截注入 目前公司产品的无线站点已经实现了业务平台组件化,所有业务组件的转场都是通过路由来完成,而各个模块是通过requirejs进行统一管理, ...

  4. 搭建LNAMP环境(七)- PHP7源码安装Memcached和Memcache拓展

    上一篇:搭建LNAMP环境(六)- PHP7源码安装MongoDB和MongoDB拓展 一.安装Memcached 1.yum安装libevent事件触发管理器 yum -y install libe ...

  5. jQuery的DOM操作实例(2)——拖拽效果&&拓展插件

    一.原生JavaScript编写拖拽效果 二.jQuery编写的拖拽效果 三.在jQuery中拓展一个拖拽插件

  6. 使用TypeScript拓展你自己的VS Code!

    0x00 前言 在前几天的美国纽约,微软举行了Connect(); //2015大会.通过这次大会,我们可以很高兴的看到微软的确变得更加开放也更加务实了.当然,会上放出了不少新产品和新功能,其中就包括 ...

  7. UITabBarController 升级定制

    UITabBarController 定制 特点 用法 1.准备工作: 加入你的相关图片,放入了Assets.xcassets; 导入Categroy文件夹(这个里面的文件,在这里不详细说明了,有疑问 ...

  8. UITabBarController 基本定制

    UITabBarController 定制 特点 用法 1.准备好你的tabBar图片及其他图片(哈哈哈!!!!),我的图片都放在了Assets.xcassets中. 2.导入本工程中的Categro ...

  9. 自定义UITabBarController标签视图控制器

    首先创建一个类,继承自UItabBarController 然后在.m文件中: 这里我有两个宏定义: #define WIDTH (myView.frame.size.width / 4) //我在写 ...

随机推荐

  1. windows上的命令telnet

    telnet可以测试端口号是否可用,比如: telnet ip:port 或者 telnet www.baidu.com PS:win7环境下,默认没有安装telnet客户端,你可以去“控制面板”-- ...

  2. 非负整数可重集去重&排序+获得可重集的全排列的几种方法

    非负整数可重集O(n)去重并排序 可重集是指元素可重复的集合,对于在一定区间内的正整数集,比如[1,n],我们可以在不不使用任何额外空间(包括不使用O(1)的空间)的情况下,用O(n)的时间复杂度完成 ...

  3. Codeforces #447 Div2 D

    #447 Div2 D 题意 给一棵完全二叉树,每条边有权值为两点间的距离,每次询问 \(x, h\) ,从结点 \(x\) 出发到某一结点的最短路的距离 \(d\) 如果小于 \(h\) ,则答案加 ...

  4. P1162 填涂颜色 洛谷

    题目描述 由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=6),涂色前和涂色后的方阵如下: 0 ...

  5. 算法-插入排序(Insertion sorting)

    本文由@呆代待殆原创,转载请注明出处. 简介:这是一个比较算法,形象的描述插入算法就和我们玩扑克的时候我们排列手牌的方式是一样的,最开始我们手上什么都没有,然后我们每摸一张牌就把它插入到正确的位置,直 ...

  6. struts2 action 字段问题

    struts2最多只能解释两级字段,比如user.username,像user.info.age在类中属性类的三段字符不能识别,只能先用user,info 然后在user.setInfo(info);

  7. 【树链剖分】【线段树】bzoj3083 遥远的国度

    记最开始的根为root,换根之后,对于当前的根rtnow和询问子树U而言, ①rtnow==U,询问整棵树 ②fa[rtnow]==U,询问除了rtnow所在子树以外的整棵树 ③rtnow在U的子树里 ...

  8. 【单调队列】【动态规划】bzoj3831 [Poi2014]Little Bird

    f(i)=min{f(j)+(D(j)<=D(i))} (max(1,i-k)<=j<=i) 有两个变量,很难用单调队列,但是(引用): 如果fi<fj,i一定比j优秀.因为如 ...

  9. 【费用流】bzoj2661 [BeiJing wc2012]连连看

    将每个数拆点,互相连边,然后满足条件的数对之间互相连边,跑最大费用流,答案是流量和费用分别除以2. 一定要i->j.j->i都连上,否则可能会出现一个数在一边被选择了,在另一边的另一个匹配 ...

  10. [CF930E]/[CF944G]Coins Exhibition

    [CF930E]/[CF944G]Coins Exhibition 题目地址: CF930E/CF944G 博客地址: [CF930E]/[CF944G]Coins Exhibition - skyl ...