关于在TabBar 中添加按钮,并通过block 或代理在控制器中实现响应
相信很多朋友会遇到在TabBar中添加按钮,并要求点击按钮能够实现一些功能,但是当我们自定义的时候,怎么才能在控制器中响应?通常我会用代理或者block,block性能更好,建议使用.

自定义TabBar类 .h
#import <UIKit/UIKit.h> typedef void(^myBlock) (NSArray *composeButton);//给block起别名,用数组来存放点击的Button @interface ZSTabBar : UITabBar @property (nonatomic,strong) myBlock composeButtonBlock;//定义block @end
.m
#import "ZSTabBar.h" @interface ZSTabBar () @property (nonatomic,strong) UIButton *composeButton;//TabBar中间的撰写按钮 @end
@implementation ZSTabBar -(instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame]; [self addSubview:self.composeButton]; return self;
}
//设置TabBar的子控件
-(void)layoutSubviews{
[super layoutSubviews]; CGFloat tabBarW = [UIScreen mainScreen].bounds.size.width / ; int index = ; UIView *tabbar = [[UIView alloc]init]; for (tabbar in self.subviews) {
//如果TabBar子控件类型是UITabBarButton,这里是判断的关键
Class class = NSClassFromString(@"UITabBarButton"); if ([tabbar isKindOfClass:class]) { //给类型属于UITabBarButton设置frame.高一定不能写0
tabbar.frame = CGRectMake(tabBarW * index, , tabBarW, self.bounds.size.height); index ++;
//因为中间的撰写按钮不属于UITabBarButton类,所以要另进行判断
if (index == ) {
index ++;
}
}
} self.composeButton.center = CGPointMake(self.frame.size.width / , self.frame.size.height / );
} #pragma mark -- 对撰写按钮懒加载
-(UIButton *)composeButton{
if (_composeButton == nil) {
_composeButton = [[UIButton alloc]init];
//设置背景图
[_composeButton setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button"] forState:UIControlStateNormal]; [_composeButton setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_highlighted"] forState:UIControlStateHighlighted];
//设置图片
[_composeButton setImage:[UIImage imageNamed:@"tabbar_compose_icon_add"] forState:UIControlStateNormal];
[_composeButton setImage:[UIImage imageNamed:@"tabbar_compose_icon_add_highlighted"] forState:UIControlStateHighlighted]; [_composeButton sizeToFit]; //点击事件
[_composeButton addTarget:self action:@selector(composeButtonClick:) forControlEvents:UIControlEventTouchUpInside]; }
return _composeButton;
} #pragma mark --撰写按钮的点击事件 -(void)composeButtonClick: (UIButton *)send{
//最好要判断一下block
if (self.composeButtonBlock) {
//将按钮添加到block中
self.composeButtonBlock(@[send]);
}
} @end
标签控制器的.m文件
#import "ZSMainFrameController.h"
#import "ZSHomeViewController.h"
#import "ZSDiscoveryViewController.h"
#import "ZSMessageViewController.h"
#import "ZSMineViewController.h"
#import "ZSTabBar.h"//自定义TabBar
@implementation ZSMainFrameController -(void)viewDidLoad{
[super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; ZSTabBar *tabBar = [[ZSTabBar alloc]init];
//TabBar是ZSTabBar类中私有属性,通过KVC赋值 关键
[self setValue:tabBar forKey:@"tabBar"];
//自定义TabBar的block
tabBar.composeButtonBlock = ^(NSArray *composeButton){
//从数组取出Button
UIButton *compoeButton = composeButton[];
//按钮的点击事件
[self composeButtonClick:compoeButton];
}; ZSHomeViewController *homeVC = [[ZSHomeViewController alloc]init];
[self addChildVC:homeVC title:@"首页" imageName:@"tabbar_home"]; ZSMessageViewController *messageVC = [[ZSMessageViewController alloc]init];
[self addChildVC:messageVC title:@"消息" imageName:@"tabbar_message_center"]; ZSDiscoveryViewController *discoverVC = [[ZSDiscoveryViewController alloc]init];
[self addChildVC:discoverVC title:@"发现" imageName:@"tabbar_discover"]; ZSMineViewController *mineVC = [[ZSMineViewController alloc]init];
[self addChildVC:mineVC title:@"我" imageName:@"tabbar_profile"]; } #pragma mark -- 添加子控制器
-(void)addChildVC:(UIViewController *)childVC title:(NSString *)title imageName:(NSString *)imageName{ childVC.title = title;
//未选中图片
childVC.tabBarItem.image = [UIImage imageNamed:imageName];
//选中图片
NSString *selectedImageName = [NSString stringWithFormat:@"%@_selected",imageName];
childVC.tabBarItem.selectedImage = [UIImage imageNamed:selectedImageName]; UINavigationController *naVC = [[UINavigationController alloc]initWithRootViewController:childVC]; [self addChildViewController:naVC]; } #pragma mark -- 中间撰写按钮的点击事件
-(void)composeButtonClick:(UIButton *)send{
在这里就可以实现撰写按钮的方法
} @end
内容比较简单,希望能给一些新手提供帮助,如果有更好的方法希望大家一起谈论分享.
关于在TabBar 中添加按钮,并通过block 或代理在控制器中实现响应的更多相关文章
- iOS开发UI篇—在UIImageView中添加按钮以及Tag的参数说明
ios开发UI篇—在ImageView中添加按钮以及Tag的参数说明 一.tag参数 一个视图通常都只有一个父视图,多个子视图,在开发中可以通过使用子视图的tag来取出对应的子视图.方法为Viewwi ...
- ios开发UI篇—在ImageView中添加按钮以及Tag的参数说明
ios开发UI篇—在ImageView中添加按钮以及Tag的参数说明 一.tag参数 一个视图通常都只有一个父视图,多个子视图,在开发中可以通过使用子视图的tag来取出对应的子视图.方法为Viewwi ...
- Dynamics CRM 2016/365 窗体中添加按钮
一.工具下载,及界面介绍 1.下载XrmToolBox工具(XrmToolBox for Microsoft Dynamics CRM/365 CE) 链接:https://www.xrmtoolbo ...
- OAF在打开的新页面中添加按钮,功能是关闭当前页面
OAF在打开的新页面中添加按钮,功能是关闭当前页面 javascript:close()
- javafx这些学会后,开发就不难了,往tablecloumn列中添加按钮,修改javafx中tableview中tablecell中的值,修改完回车表示保存到内存中
javafx开发过程中遇见难题,往tablecloumn列中添加按钮 想了很久的方法,也配有办法判断每行中有数据的地方添加按钮set bank_caozuo.setCellFactory((col)- ...
- QTableWidget中添加按钮
添加按钮 void QTableWidget::setCellWidget ( int row, int column, QWidget * widget ) widget可以是自己定义的按钮 cla ...
- MFC中 在SDI模式下的视图中添加按钮的方法
在单文档视图(SDI)结构中,视图一般用来显示数据.但是,有时也希望在视图中显示按钮或其他的控件,以满足用户的需要.下面是手动添加按钮并使按钮具有响应事件的功能的方法. 第一步:添加一个按钮 ...
- [学习笔记] 在Eclipse中添加用户库 Add User Libraries ,在项目中引用用户库
如果还没有安装Eclipse, 则请参考前文: [学习笔记] 下载.安装.启动 Eclipse(OEPE) 添加用户库 本文主要介绍在项目中直接使用第三方库的情况.就是把第三方的jar文件直接放到某 ...
- Android学习笔记之 SimpleAdapter 中添加按钮响应事件,getView的重写
Andriod 里面的ListView是一个显示列表数据的控件,常用适配器SimpleAdapter进行绑定,绑定代码如下: ListView lstView = (ListView) this.fi ...
随机推荐
- 不注册COM组件直接调用接口
本文以COM组件AppTest.dll为例,AppTest.dll中提供了ITest接口,在不使用regsvr32命令向系统注册的情况下创建ITest接口并调用. 一.导入组件或类型库: 在C++中使 ...
- HTML-中<li>标签value值的兼容问题
今天在做项目测试的时候,发现IE浏览器对HTML中<li>标记的value取值存在兼容性问题,特意从4个浏览器出发进行了一些测试.现将测试结论展示如下: 测试类型 IE8 FF16.0.1 ...
- Sea Battle
Sea Battle time limit per test 1 second memory limit per test 256 megabytes input standard input out ...
- One-Way Reform
One-Way Reform time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- 破解MyEclipse2013注册码
1.下载破解工具 http://down8.3987.com:801/2010/Myeclipse_zcj.3987.com.rar 2.打开 找到meclipse安装路径找到plugins文件夹打开 ...
- Swift: Alamofire -> http请求 & ObjectMapper -> 解析JSON
1 2 3 4 5 6 7 8 9 10 11 NSURL *URL = [NSURL URLWithString:@"http://example.com/resources/123.js ...
- Swift 与 JSON 数据 浅析
转载自:http://www.cnblogs.com/theswiftworld/p/4660177.html 我们大家平时在开发 App 的时候,相信接触最多的就是 JSON 数据了.只要你的 Ap ...
- makefile中使用echo向文件中输出版本号和编译时间
@echo "#define BUILD_TIME" `date +"%F_%H:%M:%S"` > buildTime_svnVer.h @echo & ...
- 命令行调试smali
am start -D -n com.agilebits.onepassword/.activity.LoginActivity ps | grep passu0_a126 1107 217 5107 ...
- ZOJ Problem - 2588 Burning Bridges tarjan算法求割边
题意:求无向图的割边. 思路:tarjan算法求割边,访问到一个点,如果这个点的low值比它的dfn值大,它就是割边,直接ans++(之所以可以直接ans++,是因为他与割点不同,每条边只访问了一遍) ...