## 一:效果图
自定义tabBar实现最下面中间的添加按钮
![](https://box.kancloud.cn/2016-01-20_569f1d9851330.jpg)
## 二:思路
首先在自己的tabBarController中把系统的tabBar设置成自己的tabBar(NYTabBar),这里由于tabBar的属性是readonly的,所以我们要用kvc或者是消息管理来设置他
然后就写自己的NYTabBar。这个写起来首先 遍历当前tabBar上的所有view,如果是UITabBarButton,就取出来重新设置他们的位置,并且重新赋值,接下来就是空出中间的添加的位置,然后把添加按钮放上去,就ok了。
## 三:代码
### 调用
首先是如何调用的代码
~~~
//自定义tabBar
NYTabBar *tabBar = [[NYTabBar alloc]initWithFrame:self.tabBar.frame];
//用kvc把readly的tabBar属性改成自定义的
[self setValue:tabBar forKey:@"tabBar"];
~~~
### NYTabBar.m
NYTabBar.h文件就不写了 ,里面啥都没有
NYTabBar.m:
~~~
//
// NYTabBar.m
// 猫猫微博
//
// Created by apple on 15-7-24.
// Copyright (c) 2015年 znycat. All rights reserved.
//
#import "NYTabBar.h"
@interface NYTabBar()
/**
* 添加增加按钮
*/
@property (nonatomic, weak) UIButton *addButton;
@end
@implementation NYTabBar
-(UIButton *)addButton
{
if (_addButton == nil) {
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add"] forState:UIControlStateNormal];
[btn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button"] forState:UIControlStateNormal];
[btn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add_highlighted"] forState:UIControlStateHighlighted];
[btn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_highlighted"] forState:UIControlStateHighlighted];
_addButton = btn;
//是按钮的尺寸默认跟背景图片一样大
[btn sizeToFit];
[self addSubview:_addButton];
}
return _addButton;
}
//调整子空间的位置
-(void)layoutSubviews
{
[super layoutSubviews];
CGFloat w = self.bounds.size.width;
CGFloat h = self.bounds.size.height;
CGFloat btnX = 0;
CGFloat btnY = 0;
CGFloat btnW = w / 5;
CGFloat btnH = h;
int i = 0;
//1 , 遍历当前tabBar上的所有view
for (UIView *tabBarBtn in self.subviews) {
//2,如果是UITabBarButton,就取出来重新设置他们的位置
if ([tabBarBtn isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
btnX = i * btnW;
tabBarBtn.frame = CGRectMake(btnX, btnY, btnW, btnH);
//当到了第二个时候,再加一个位置空竹添加按钮的位置。
if (i==1) {
i++;
}
i++;
}
}
//设置添加按钮 add按钮的位置
self.addButton.center = CGPointMake(w * 0.5, h * 0.5);
}
@end
~~~
## 四:补充
调用的时候还可以用消息管理
~~~
//自定义tabBar
NYTabBar *tabBar = [[NYTabBar alloc]initWithFrame:self.tabBar.frame];
/*这个地方还有一种用消息管理设置的,这样也可以,使用个步骤是
1:先导入头文件#import <objc/message.h>
2:到项目中Build Settings中查找msg ,然后把yes改成no
3:代码写objc_msgSend调用就行了
注意:这样的方法框架中比较多,目的为了不让人看懂,还有显得c牛逼,——————没啥鸟用。。
*/
//用消息管理设置
objc_msgSend(self, @selector(setTabBar:),tabBar);
~~~
步骤:
1:先导入头文件
~~~
#import <objc/message.h>
~~~
2:到项目中Build Settings中查找msg ,然后把yes改成no
![](https://box.kancloud.cn/2016-01-20_569f1d9866aff.jpg)
3:代码写objc_msgSend调用就行了
注意:这样的方法框架中比较多,目的为了不让人看懂,还有显得c牛逼,——————没啥鸟用。。
- 前言
- (1)微博主框架-子控制器的添加
- (2)微博主框架-自定义导航控制器NavigationController
- (3)微博主框架-UIImage防止iOS7之后自动渲染_定义分类
- (4)微博自定义tabBar中间的添加按钮
- (5)微博自定义搜索框searchBar
- (6)导航控制器NavigationController 的滑动回退功能实现
- (7)程序启动新特性用UICollectionViewController实现
- (8)用AFNetworking和SDWebImage简单加载微博数据
- (9)微博模型之时间相关重要操作,判断刚刚,昨天,今年等等
- (10)微博cell中图片的显示以及各种填充模式简介
- (11)发送微博自定义TextView实现带占位文字
- (12)发送微博自定义工具条代理实现点击事件
- (13)发送微博调用相机里面的图片以及调用相机