iOS开发之实现TabBar中间凸起“+”按钮

参考:http://www.jianshu.com/p/46f61bc7a938,https://github.com/Mringkang/KBCustomCenterTabbar

效果:

PS:左边和右边的按钮已在StoryBoard和其他代码文件设置好,这里只给出中间按钮的实现,按钮的背景图片需另外设计或下载,然后添加到资源库。另外,这里需要用到UIView分类的一些属性,参考http://www.cnblogs.com/guitarandcode/p/5758995.html   ,最后在StoryBoard中选择TabBarController对应下面自定义的TabBarController即可

自定义TabBar

MyTabBar.h

 1 #import <UIKit/UIKit.h>
 2
 3 @class MyTabBar;
 4
 5 //MyTabBar的代理必须实现addButtonClick,以响应中间“+”按钮的点击事件
 6 @protocol MyTabBarDelegate <NSObject>
 7
 8 -(void)addButtonClick:(MyTabBar *)tabBar;
 9
10 @end
11
12 @interface MyTabBar : UITabBar
13
14 //指向MyTabBar的代理
15 @property (nonatomic,weak) id<MyTabBarDelegate> myTabBarDelegate;
16
17 @end

MyTabBar.m

  1 #import "MyTabBar.h"
  2 #import "UIView+Category.h"
  3
  4 #define AddButtonMargin 10
  5
  6 @interface MyTabBar()
  7
  8 //指向中间“+”按钮
  9 @property (nonatomic,weak) UIButton *addButton;
 10 //指向“添加”标签
 11 @property (nonatomic,weak) UILabel *addLabel;
 12
 13 @end
 14
 15 @implementation MyTabBar
 16
 17 /*
 18 // Only override drawRect: if you perform custom drawing.
 19 // An empty implementation adversely affects performance during animation.
 20 - (void)drawRect:(CGRect)rect {
 21     // Drawing code
 22 }
 23 */
 24
 25 -(instancetype)initWithFrame:(CGRect)frame
 26 {
 27     if(self = [super initWithFrame:frame])
 28     {
 29         //创建中间“+”按钮
 30         UIButton *addBtn = [[UIButton alloc] init];
 31         //设置默认背景图片
 32         [addBtn setBackgroundImage:[UIImage imageNamed:@"AddButtonIcon"] forState:UIControlStateNormal];
 33         //设置按下时背景图片
 34         [addBtn setBackgroundImage:[UIImage imageNamed:@"AddButtonIcon-Active"] forState:UIControlStateHighlighted];
 35         //添加响应事件
 36         [addBtn addTarget:self action:@selector(addBtnDidClick) forControlEvents:UIControlEventTouchUpInside];
 37         //将按钮添加到TabBar
 38         [self addSubview:addBtn];
 39
 40         self.addButton = addBtn;
 41     }
 42     return self;
 43 }
 44
 45 //响应中间“+”按钮点击事件
 46 -(void)addBtnDidClick
 47 {
 48     if([self.myTabBarDelegate respondsToSelector:@selector(addButtonClick:)])
 49     {
 50         [self.myTabBarDelegate addButtonClick:self];
 51     }
 52 }
 53
 54 -(void)layoutSubviews
 55 {
 56     [super layoutSubviews];
 57
 58     //去掉TabBar上部的横线
 59     for (UIView *view in self.subviews)
 60     {
 61         if ([view isKindOfClass:[UIImageView class]] && view.bounds.size.height <= 1)   //横线的高度为0.5
 62         {
 63             UIImageView *line = (UIImageView *)view;
 64             line.hidden = YES;
 65         }
 66     }
 67
 68     //设置“+”按钮的位置
 69     self.addButton.centerX = self.centerX;
 70     self.addButton.centerY = self.height * 0.5 - 1.5 * AddButtonMargin;
 71     //设置“+”按钮的大小为图片的大小
 72     self.addButton.size = CGSizeMake(self.addButton.currentBackgroundImage.size.width, self.addButton.currentBackgroundImage.size.height);
 73
 74     //创建并设置“+”按钮下方的文本为“添加”
 75     UILabel *addLbl = [[UILabel alloc] init];
 76     addLbl.text = @"添加";
 77     addLbl.font = [UIFont systemFontOfSize:10];
 78     addLbl.textColor = [UIColor grayColor];
 79     [addLbl sizeToFit];
 80
 81     //设置“添加”label的位置
 82     addLbl.centerX = self.addButton.centerX;
 83     addLbl.centerY = CGRectGetMaxY(self.addButton.frame) + 0.5 * AddButtonMargin + 0.5;
 84
 85     [self addSubview:addLbl];
 86
 87     self.addLabel = addLbl;
 88
 89     int btnIndex = 0;
 90     //系统自带的按钮类型是UITabBarButton,找出这些类型的按钮,然后重新排布位置,空出中间的位置
 91     Class class = NSClassFromString(@"UITabBarButton");
 92     for (UIView *btn in self.subviews) {//遍历TabBar的子控件
 93         if ([btn isKindOfClass:class]) {//如果是系统的UITabBarButton,那么就调整子控件位置,空出中间位置
 94             //每一个按钮的宽度等于TabBar的三分之一
 95             btn.width = self.width / 3;
 96
 97             btn.x = btn.width * btnIndex;
 98
 99             btnIndex++;
100             //如果索引是1(即“+”按钮),直接让索引加一
101             if (btnIndex == 1) {
102                 btnIndex++;
103             }
104
105         }
106     }
107     //将“+”按钮放到视图层次最前面
108     [self bringSubviewToFront:self.addButton];
109 }
110
111 //重写hitTest方法,去监听"+"按钮和“添加”标签的点击,目的是为了让凸出的部分点击也有反应
112 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
113
114     //这一个判断是关键,不判断的话push到其他页面,点击“+”按钮的位置也是会有反应的,这样就不好了
115     //self.isHidden == NO 说明当前页面是有TabBar的,那么肯定是在根控制器页面
116     //在根控制器页面,那么我们就需要判断手指点击的位置是否在“+”按钮或“添加”标签上
117     //是的话让“+”按钮自己处理点击事件,不是的话让系统去处理点击事件就可以了
118     if (self.isHidden == NO)
119     {
120
121         //将当前TabBar的触摸点转换坐标系,转换到“+”按钮的身上,生成一个新的点
122         CGPoint newA = [self convertPoint:point toView:self.addButton];
123         //将当前TabBar的触摸点转换坐标系,转换到“添加”标签的身上,生成一个新的点
124         CGPoint newL = [self convertPoint:point toView:self.addLabel];
125
126         //判断如果这个新的点是在“+”按钮身上,那么处理点击事件最合适的view就是“+”按钮
127         if ( [self.addButton pointInside:newA withEvent:event])
128         {
129             return self.addButton;
130         }
131         //判断如果这个新的点是在“添加”标签身上,那么也让“+”按钮处理事件
132         else if([self.addLabel pointInside:newL withEvent:event])
133         {
134             return self.addButton;
135         }
136         else
137         {//如果点不在“+”按钮身上,直接让系统处理就可以了
138
139             return [super hitTest:point withEvent:event];
140         }
141     }
142     else
143     {
144         //TabBar隐藏了,那么说明已经push到其他的页面了,这个时候还是让系统去判断最合适的view处理就好了
145         return [super hitTest:point withEvent:event];
146     }
147 }
148
149 @end

自定义TabBarController

MyTabBarController.h

1 #import <UIKit/UIKit.h>
2
3 @interface MyTabBarController : UITabBarController
4
5 @end

MyTabBarController.m

 1 #import "MyTabBarController.h"
 2 #import "MyTabBar.h"
 3
 4 @interface MyTabBarController () <MyTabBarDelegate> //实现自定义TabBar协议
 5
 6 @end
 7
 8 @implementation MyTabBarController
 9
10 - (void)viewDidLoad {
11     [super viewDidLoad];
12     // Do any additional setup after loading the view.
13
14     //创建自定义TabBar
15     MyTabBar *myTabBar = [[MyTabBar alloc] init];
16     myTabBar.myTabBarDelegate = self;
17
18     //利用KVC替换默认的TabBar
19     [self setValue:myTabBar forKey:@"tabBar"];
20
21 }
22
23 #pragma mark - MyTabBarDelegate
24 -(void)addButtonClick:(MyTabBar *)tabBar
25 {
26     //测试中间“+”按钮是否可以点击并处理事件
27     UIAlertController *controller = [UIAlertController alertControllerWithTitle:@"test" message:@"Test" preferredStyle:UIAlertControllerStyleAlert];
28     UIAlertAction *action = [UIAlertAction actionWithTitle:@"test" style:UIAlertActionStyleDefault handler:nil];
29     [controller addAction:action];
30     [self presentViewController:controller animated:YES completion:nil];
31 }
时间: 2024-10-12 14:01:15

iOS开发之实现TabBar中间凸起“+”按钮的相关文章

iOS开发之 修改TabBar上的按钮的点击颜色

设置被选中的图片 self.tabBarController.tabBar.selectedItem.selectedImage = [UIImage imageNamed:@"main.png"]; 设置被选中颜色 self.tabBarController.tabBar.tintColor = [UIColor redColor];

iOS 开发之 - iOS6适配 - 导航栏按钮透明方法

首先上张图: 1:ios6导航栏默认按钮 rightBarButtonItem   是不是很丑的赶脚? 现在通过以下方法来改变以下:code: UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeCustom]; rightButton.frame = CGRectMake(0, 0, 40, 40); [rightButton setTitle:@"提交" forState:UIControlStateNormal

【iOS开发-56】案例BUG:按钮的enabled、控件的userInteractionEnabled以及两种提示框UIAlert和UIActionSheet

接上述案例找BUG:[iOS开发-51]案例学习:动画新写法.删除子视图.视图顺序.延迟方法.按钮多功能用法及icon图标和启动页设置 (1)BUG:答案满了就不能再点击option按钮,答案没满就能点. 在optionClick方法的if(full)中设置,即判断答案是否满了,如果满了,则: if (full) { //如果答案满了,不管是否正确,只要满了,下面的option按钮就不能被点击 for (UIButton *optionBtn in self.optionView.subview

IOS开发-关于自定义TabBar条

今天在做项目的时候,突然有一个模块需要自定义TabBar条. 在平常很多做项目的时候,都没有去自定义过,大部分都是使用系统自带的.今天整理一个自定义TabBar条的步骤. 首先看下我们最终实现的效果: 首先需要继承UItabBar自定义一个自己的tabBar .h #import <UIKit/UIKit.h> @class THTabBar; @protocol THTabBarDelegate <UITabBarDelegate> @optional - (void)tabBa

ios开发-UI-自定义Tabbar 图书布局

#import "ViewController.h" #import "CGTabbar.h" #import "QHCListView.h" #import "QHJavaListView.h" #import "QHOCListView.h" @interface ViewController ()<CGTabbarDelegate> @property(nonatomic,strong)N

ios开发随笔第一篇-button,label按钮的一些属性的使用

我用的是纯代码方式,喜欢用storyboard开发的其实也很爽了; 首先谈谈button,ios中新建button这个对象一般接触的都明白,UIButton *button名=[ UIButton alloc]init]; 我喜欢用 [[UIButton alloc]initWithFrame:CGRectMake(x,y,width,heigt)];直接把位置给出来了 button的背景颜色设置 button名.backgroundColor=[UIColor cyanColor]; 当然你觉

iOS 开发修改 label 值,由按钮触发

要连二次连线, 1,是连接 IBOutlet ,从界面上的 label 按住 control 的同时连到 viewcontroller.h 中. 2,是连接 button 的事件,从按钮的事件连接到 view controller.m 中. 再做些小修改就可以了. label.text = @"hello yourname";

iOS开发——代码生成TabBar与视图切换详解

我在之前多篇博客中讲解了在不使用storyboard而使用nib文件的情况下,使用代码生成导航栏并进行跳转,具体可以参考<iOS开发--界面跳转与返回及视图类型详解><iOS纯代码实现界面建立.跳转.导航栏(无storyboard.无nib)(Objective-C)>.今天我来讲解下在使用nib搭建界面的情况下,用代码生成TabBar,并进行界面之间的跳转.代码示例已经上传至:https://github.com/chenyufeng1991/TabBarTest   . (1)

iOS开发项目篇—04添加导航栏的按钮

iOS开发项目篇—04添加导航栏的按钮 一.设置导航栏的按钮 要求实现的效果:             说明:默认状态下和高亮状态下的图片是不一样的. 按钮的图片需要设置默认状态和高亮状态时的显示,系统了提供的下面方法 viewController.navigationItem.leftBarButtonItem=[UIBarButtonItem alloc]initWithImage:<#(UIImage *)#> style:<#(UIBarButtonItemStyle)#>