UITabBarController超强拓展
一、运行效果图

二、项目结构截图

三、主要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超强拓展
注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权
UITabBarController超强拓展的更多相关文章
- C++对C的函数拓展
一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...
- RabbitMQ + PHP (二)AMQP拓展安装
上篇说到了 RabbitMQ 的安装. 这次要在讲案例之前,需要安装PHP的AMQP扩展.不然可能会报以下两个错误. 1.Fatal error: Class 'AMQPConnection' not ...
- chrome拓展开发实战:页面脚本的拦截注入
原文请访问个人博客:chrome拓展开发实战:页面脚本的拦截注入 目前公司产品的无线站点已经实现了业务平台组件化,所有业务组件的转场都是通过路由来完成,而各个模块是通过requirejs进行统一管理, ...
- 搭建LNAMP环境(七)- PHP7源码安装Memcached和Memcache拓展
上一篇:搭建LNAMP环境(六)- PHP7源码安装MongoDB和MongoDB拓展 一.安装Memcached 1.yum安装libevent事件触发管理器 yum -y install libe ...
- jQuery的DOM操作实例(2)——拖拽效果&&拓展插件
一.原生JavaScript编写拖拽效果 二.jQuery编写的拖拽效果 三.在jQuery中拓展一个拖拽插件
- 使用TypeScript拓展你自己的VS Code!
0x00 前言 在前几天的美国纽约,微软举行了Connect(); //2015大会.通过这次大会,我们可以很高兴的看到微软的确变得更加开放也更加务实了.当然,会上放出了不少新产品和新功能,其中就包括 ...
- UITabBarController 升级定制
UITabBarController 定制 特点 用法 1.准备工作: 加入你的相关图片,放入了Assets.xcassets; 导入Categroy文件夹(这个里面的文件,在这里不详细说明了,有疑问 ...
- UITabBarController 基本定制
UITabBarController 定制 特点 用法 1.准备好你的tabBar图片及其他图片(哈哈哈!!!!),我的图片都放在了Assets.xcassets中. 2.导入本工程中的Categro ...
- 自定义UITabBarController标签视图控制器
首先创建一个类,继承自UItabBarController 然后在.m文件中: 这里我有两个宏定义: #define WIDTH (myView.frame.size.width / 4) //我在写 ...
随机推荐
- Jquery实现全选和取消全选的方法
<input type="checkbox" id="all" />全选<br /> <input type="chec ...
- 将csv格式的数据文件导入/导出数据库+添加新的字段
最近一直忙于实验室的事情,没有好好更新博客,在抓包的过程中,遇到了很多问题. 因为我常用Wireshark将抓包信息导出为csv文件,这里简单mark一下将csv文件导入/导出到数据库的2种方法: 一 ...
- 19、Flask实战第19天:CSRF攻击与防御
CSRF攻击原理 网站是通过cookie来实现登录功能的.而cookie只要存在浏览器中,那么浏览器在访问这个cookie的服务器的时候,就会自动的携带cookie信息到服务器上去.那么这时候就存在一 ...
- PL SQL 基础
Oracle之PL/SQL学习笔记 自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整 ...
- HDU 1754 I Hate It<区间最值 单点修改>
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- iOS开发——MJExtension复杂数组用法
最近在看MJExtension的Demo,发现了一个plist文件直接转数组模型的方法.以前研究过但是浅尝辄止没有解决,这几天有时间,好好看了看,找到了解决办法,与大家分享. 如果大家的项目中有这种嵌 ...
- iOS开发——随机数的使用
1).arc4random() 比较精确不需要生成随即种子 使用方法 : 通过arc4random() 获取0到x-1之间的整数的代码如下: ...
- 在WPF中合并两个ObservableCollection
WPF中的ObservableCollection是一个非常常用的集合对象,我们可以通过将它绑定到ListBox之类的集合控件上时,当集合发生变更时,会同步更新到界面上.但是,有的时候我们需要合并两个 ...
- C# 使用 System.Web.Script.Serialization 解析 JSON
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programming Langu ...
- oracle--v$lock type字段详解
Name Description AD ASM Disk AU Lock AF Advisor Framework AG Analytic Workspace Generation AK GES De ...