iOS 自定义TabBarController
Posted 飞羽孟德
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 自定义TabBarController相关的知识,希望对你有一定的参考价值。
转自:http://blog.csdn.net/xn4545945/article/details/35994863
一、自定义的思路
iOS中的TabBarController确实已经很强大了,大部分主流ios应用都会采用。但是往往也不能满足全部的需求,因此需要自定义TabBar,自定义需要对系统的TabBar工作方式有很好的理解,自定义需要勇气。
自定义TabBar的原则:尽量利用系统自带TabBar,只改需要改的地方。
三、细节很重要
XNTabBarController.h
- #import <UIKit/UIKit.h> @interface @end
XNTabBarController.m
- // // XNTabBarController.m // // // Created by neng on 14-6-19. // Copyright (c) 2014年 neng. All rights reserved. // #import "XNTabBarController.h" #import "Common.h" #import "XNTabBarButton.h" @interface /**
- * 设置之前选中的按钮
- */ @propertynonatomicUIButton @end @implementation void super];
- // NSLog(@"%s",__func__); // NSLog(@"%@",self.view.subviews); //能打印出所有子视图,和其frame self);
- self.frame self removeFromSuperview
- UIView]];
- = rect;
- = [UIColor];
- self addSubview forint; i < ; i++) {
- XNTabBarButton]];
- NSString:, i +];
- NSString:, i +];
- :[UIImage:imageName]:UIControlStateNormal];
- :[UIImage:imageNameSel]:UIControlStateSelected];
- i.size / ;
- = CGRectMake(x, , myView.size / , myView.size);
- :btn];
- = i;
- :self:@selector forControlEvents
- if == i) {
- = YES self = btn;
- /**
- * 自定义TabBar的按钮点击事件
- */ voidUIButton
- self.selectedNO
- = YES
- self = button;
- self = button;
- @end
XNTabBarButton.h
- #import <UIKit/UIKit.h> @interface @end
XNTabBarButton.m
- #import "XNTabBarButton.h" @implementation /**什么也不做就可以取消系统按钮的高亮状态*/ voidBOOL // [super setHighlighted:highlighted]; @end
五、代码重构
XNTabBar.h
- #import <UIKit/UIKit.h> @class @protocol /**
- * 工具栏按钮被选中, 记录从哪里跳转到哪里. (方便以后做相应特效)
- */ void tabBarXNTabBar:(NSInteger) from:(NSInteger)to;
- @end @interface @propertynonatomicid /**
- * 使用特定图片来创建按钮, 这样做的好处就是可扩展性. 拿到别的项目里面去也能换图片直接用
- *
- * @param image 普通状态下的图片
- * @param selectedImage 选中状态下的图片
- */ voidUIImage:(UIImage @end
XNTabBar.m
- // // XNTabBar.m // // Created by neng on 14-6-19. // Copyright (c) 2014年 neng. All rights reserved. // #import "XNTabBar.h" #import "XNTabBarButton.h" @interface /**
- * 设置之前选中的按钮
- */ @propertynonatomicUIButton @end @implementation /**
- * 在这个方法里写控件初始化的东西, 调用init方法时会调用
- */ //- (id)initWithFrame:(CGRect)frame { // if (self = [super initWithFrame:frame]) { // //添加按钮 // for (int i = 0; i < 5; i++) { //取消掉特定的数字 // //UIButton *btn = [[UIButton alloc] init]; // XNTabBarButton *btn = [[XNTabBarButton alloc] init]; // // NSString *imageName = [NSString stringWithFormat:@"TabBar%d", i + 1]; // NSString *imageNameSel = [NSString stringWithFormat:@"TabBar%dSel", i + 1]; // // [btn setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal]; // [btn setImage:[UIImage imageNamed:imageNameSel] forState:UIControlStateSelected]; // // [self addSubview:btn]; // // btn.tag = i; //设置按钮的标记, 方便来索引当前的按钮,并跳转到相应的视图 // // //带参数的监听方法记得加"冒号" // [btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside]; // // if (0 == i) { // [self clickBtn:btn]; // } // } // } // return self; //} voidUIImage:(UIImage UIButton]];
- :image:UIControlStateNormal];
- :selectedImage:UIControlStateSelected];
- self:btn];
- :self:@selector forControlEvents
- ifself.count) {
- self:btn];
- /**专门用来布局子视图, 别忘了调用super方法*/ void super];
- intself.count forint; i < count; i++) {
- UIButtonself[i];
- = i;
- iself.size / count;
- ;
- self.size / count;
- self.size;
- = CGRectMake(x, y, width, height);
- /**
- * 自定义TabBar的按钮点击事件
- */ voidUIButton
- self.selectedNO
- = YES
- self = button;
- ifself [email protected] self tabBarself:self.tag:button];
- @end
原先的XNTabBarController.m经过修改后,注释了原先的代码。
- // // XNTabBarController.m // // Created by neng on 14-6-19. // Copyright (c) 2014年 neng. All rights reserved. // #import "XNTabBarController.h" #import "XNTabBarButton.h" #import "XNTabBar.h" @interface /**
- * 设置之前选中的按钮
- */ @propertynonatomicUIButton @end @implementation void super];
- // NSLog(@"%s",__func__); // NSLog(@"%@",self.view.subviews); //能打印出所有子视图,和其frame // LogFun; // LogSubviews(self.view);
- self.bounds
- self);
- XNTabBar]];
- = self
- = rect;
- self addSubview
- forint; i<self.count
- NSString:, i +];
- NSString:, i +];
- UIImage:imageName];
- UIImage:imageNameSel];
- :image:imageSel];
- // //添加按钮 // for (int i = 0; i < 5; i++) { // //UIButton *btn = [[UIButton alloc] init]; // XNTabBarButton *btn = [[XNTabBarButton alloc] init]; // // NSString *imageName = [NSString stringWithFormat:@"TabBar%d", i + 1]; // NSString *imageNameSel = [NSString stringWithFormat:@"TabBar%dSel", i + 1]; // // [btn setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal]; // [btn setImage:[UIImage imageNamed:imageNameSel] forState:UIControlStateSelected]; // // CGFloat x = i * myView.frame.size.width / 5; // btn.frame = CGRectMake(x, 0, myView.frame.size.width / 5, myView.frame.size.height); // // [myView addSubview:btn]; // // btn.tag = i;//设置按钮的标记, 方便来索引当前的按钮,并跳转到相应的视图 // // //带参数的监听方法记得加"冒号" // [btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside]; // // //设置刚进入时,第一个按钮为选中状态 // if (0 == i) { // btn.selected = YES; // self.selectedBtn = btn; //设置该按钮为选中的按钮 // } // } /**永远别忘记设置代理*/ voidXNTabBar:(NSInteger)from:(NSInteger)to {
- self = to;
- /**
- * 自定义TabBar的按钮点击事件
- */ //- (void)clickBtn:(UIButton *)button { // //1.先将之前选中的按钮设置为未选中 // self.selectedBtn.selected = NO; // //2.再将当前按钮设置为选中 // button.selected = YES; // //3.最后把当前按钮赋值为之前选中的按钮 // self.selectedBtn = button; // // //4.跳转到相应的视图控制器. (通过selectIndex参数来设置选中了那个控制器) // self.selectedIndex = button.tag; //} @end
自定义后的效果图:
例子源码下载 : http://download.csdn.net/detail/xn4545945/7572263
转载请注明出处:http://blog.csdn.net/xn4545945
以上是关于iOS 自定义TabBarController的主要内容,如果未能解决你的问题,请参考以下文章
iOS:CYLTabBarController低耦合集成TabBarController
TabBarController 添加自定义按钮不可点击问题[重复]
如何将自定义 tableView 搜索工具与 UISearchDisplayController 结合使用?
从自定义 UIViewController 导航到 TabBarController 而不使用 segue
UIViewController 上的自定义属性,如 splitViewController 或 tabBarController