关于在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 ...
随机推荐
- wl18xx编译的时候出现WARNING: "simple_open" WARNING: "wl12xx_get_platform_data"
................................................................................................... ...
- C#获取本机局域网ip和公网ip
1.获取局域网ip IPAddress ipAddr = Dns.Resolve(Dns.GetHostName()).AddressList[0];//获得当前IP地址 string ip=ipAd ...
- 转 Windows 7设置定时自动执行任务方法
在使用电脑的时候可能会遇到一些需要无人值守让电脑自行执行任务后定时关机的情形,在Win7系统中,我们可以使用"任务计划"设置功能结合 shutdown命令灵活设置任务计划,让Win ...
- 建立TCP连接的三次握手
请求端(通常称为客户)发送一个 SYN 报文段( SYN 为 1 )指明客户打算连接的服务器的端口,以及初始顺序号( ISN ).服务器发回包含服务器的初始顺序号( ISN )的 SYN 报文段( S ...
- 如何查看自己电脑支持OpenGL core版本
1. 起因: 红宝书上的例子在电脑上运行后没有效果,但是怎么也找不到原因,反复对看了书上的源码和代码发现没有任何问题,但是就是没有树上写的效果 2. 思路:查看函数的说明,这里推荐使用docs.gl, ...
- 解决centos无法上传文件和打开文件夹
使用yum搭建了ftp服务..yum的使用参考:http://blog.csdn.net/enson16855/article/details/9140623 windows使用FileZilla连接 ...
- ssh登录nat模式的VMware虚拟机
有时候本地PC是固定IP上网方式且无多余IP,而我们又希望使用putty登陆VMware中的虚拟机且虚拟机可以上外网,那么这时候就可以使用端口映射. 1.本地环境简述 本地PC IP:192.168. ...
- 快学Scala-第一章 基础
知识点: Scala程序并不是一个解释器,实际发生的是,你输入的内容被快速的编译成字节码,然后这段字节码交由Java虚拟机执行. 以val定义的值是一个常量,以var定义的值是一个变量,声明值或变量但 ...
- Android开发10.2:UI组件AutoCompleteTextView(自动完成文本框)
概述 AutoCompleteTextVeiw(自动完成文本框)从 EditText派生而出 PS :EditText用法介绍 当用户输入一定字符后,自动完成自动完成文本框会显示 ...
- UIRoot
scalingStyle: Flexible:固定大小,不管设备屏幕的大小是多少,都以固定的像素显示UI Constrained: 可适应屏幕 如要使640*480像素的背景图适应屏幕,要如下设置 c ...