UITabBarController 和 UINavigationController 几乎是iOS APP的标配。

UITabBarController分栏(标签栏)控制器, 和UINavigationController导航控制器一样,都是用来管理视图控制器的容器类型的控制器。

 1、UITabBarController的基本使用

(1)、创建几个视图控制器

(2)、将视图控制器添加到TabBarController

(3)、设置窗口的跟视图控制器为分栏控制器

(4)、设置分栏控制器的显示样式

    UIViewController *vc1 = [[UIViewController alloc] init];
vc1.view.backgroundColor = [UIColor redColor];
vc1.title = @"VC1"; // 视图控制器的分栏按钮
// 视图控制器的分栏按钮,如果没有被显示创建,并且被使用了,则会自动根据视图控制器的title来创建
//vc1.tabBarItem; UIViewController *vc2 = [[UIViewController alloc] init];
vc2.view.backgroundColor = [UIColor yellowColor];
vc2.title = @"VC2"; UIViewController *vc3 = [[UIViewController alloc] init];
vc3.view.backgroundColor = [UIColor blueColor];
vc3.title = @"VC3"; UIViewController *vc4 = [[UIViewController alloc] init];
vc4.view.backgroundColor = [UIColor greenColor];
vc4.title = @"VC4"; // 创建分栏(标签栏)控制器, 和导航控制器一样,都是用来管理视图控制器的容器类型的控制器。
// 分栏控制器和导航控制器一样,也是通过viewControllers来管理其子视图控制器
UITabBarController *tabBarCtrl = [[UITabBarController alloc] init]; tabBarCtrl.view.backgroundColor = [UIColor cyanColor]; // 把数据中得视图器交给分栏控制器管理
// 分栏控制器会自动将其管理的视图控制器的分栏按钮(UITabBarItem)放到分栏上显示
tabBarCtrl.viewControllers = @[vc1, vc2, vc3, vc4]; // 设置窗口的跟视图控制器为分栏控制器
self.window.rootViewController = tabBarCtrl; // 取到分栏控制器的分栏
UITabBar *tabBar = tabBarCtrl.tabBar; // 设置分栏的风格
tabBar.barStyle = UIBarStyleBlack; // 是否透明
tabBar.translucent = NO; // 设置分栏的前景颜色
tabBar.barTintColor = [UIColor brownColor]; // 设置分栏元素项的颜色
tabBar.tintColor = [UIColor purpleColor]; // 设置分栏按钮的选中指定图片
tabBar.selectionIndicatorImage = [UIImage imageNamed:@"home.png"]; [self.window makeKeyAndVisible];

效果如图:

 2、UITabBarController和的UINavigationController结合使用

如果有如图需求:点击切换到下一个页面,隐藏UITabBarController。

(1)、创建分栏控制器:

// 创建分栏控制器管理的子视图控制器
- (void)createViewControllers
{
OneViewController *oneVC = [[OneViewController alloc] init];
MyNavgationController *navCtrl1 = [[MyNavgationController alloc] initWithRootViewController:oneVC];
// navCtrl1.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemSearch tag:0]; TwoViewController *twoVC = [[TwoViewController alloc] init];
UINavigationController *navCtrl2 = [[UINavigationController alloc] initWithRootViewController:twoVC]; ThreeViewController *threeVC = [[ThreeViewController alloc] init];
FourViewController *fourVC = [[FourViewController alloc] init]; FiveViewController *fiveVC = [[FiveViewController alloc] init]; SixViewController *sixVC = [[SixViewController alloc] init]; // 分栏控制器管理的视图控制器的tabBarController属性,自动指向分栏控制器。
// 当分栏控制器管理的视图控制器的个数超过五个时,会自动创建一个more的导航控制器,并且自动将第五个以及以后的视图控制器添加到more导航控制器中。
self.viewControllers = @[navCtrl1, navCtrl2, threeVC, fourVC, fiveVC, sixVC];
}

(2)、在MyNavgationController里面,重写跳转方法:

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
//1. 取出分栏
UITabBar *tabBar = self.tabBarController.tabBar; // 将frame左移分栏的宽度
CGRect frame = tabBar.frame;
frame.origin.x -= tabBar.frame.size.width; // 动画影藏tabBar
[UIView animateWithDuration:0.28 animations:^{
tabBar.frame = frame;
}]; [super pushViewController:viewController animated:animated];
} - (UIViewController *)popViewControllerAnimated:(BOOL)animated
{
//1. 取出分栏
UITabBar *tabBar = self.tabBarController.tabBar; // 将frame左移分栏的宽度
CGRect frame = tabBar.frame;
frame.origin.x += tabBar.frame.size.width; // 动画影藏tabBar
[UIView animateWithDuration:0.28 animations:^{
tabBar.frame = frame;
}]; return [super popViewControllerAnimated:YES];
}

 3、定制UITabBarController

#import "MyTabBar.h"

@interface MyTabBarController () <MyTabBarDelegate>

// 保存之前选中的按钮
@property (nonatomic, retain) UIButton *preSelBtn;
@end @implementation MyTabBarController - (void)viewDidLoad {
[super viewDidLoad];
[self createViewControllers]; [self createTabBar];
} // 创建分栏控制器管理的视图控制器数据
- (void)createViewControllers
{
FirstViewController *firstVC = [[FirstViewController alloc] init];
UINavigationController *nav1 =[[UINavigationController alloc] initWithRootViewController:firstVC]; SecondViewController *secondVC = [[SecondViewController alloc] init]; ThirdViewController *thirdVC = [[ThirdViewController alloc] init]; FourthViewController *fourthVC = [[FourthViewController alloc] init]; self.viewControllers = @[nav1, secondVC, thirdVC, fourthVC];
} // 定制tabBar tabBar 49
- (void)createTabBar
{
// 0. 隐藏分栏控制器自带的tabbar
[self.tabBar setHidden:YES]; MyTabBar *tabBr = [[MyTabBar alloc] init]; tabBr.frame = self.tabBar.frame;
tabBr.delegate = self; [self.view addSubview:tabBr];
} #pragma mark - MyTabBarDelegate协议方法
- (void)tabBar:(MyTabBar *)tabBar didSelectItemWithIndex:(NSUInteger)toIndex
{
// 设置分栏控制器选中的视图控制器
self.selectedIndex = toIndex;
}
@class MyTabBar;

@protocol MyTabBarDelegate <NSObject>

@optional
- (void)tabBar:(MyTabBar *)tabBar didSelectItemWithIndex:(NSUInteger)toIndex; - (void)tabBar:(MyTabBar *)tabBar didSelectItemWithIndex:(NSUInteger)toIndex fromIndex:(NSUInteger)fromIndex; @end @interface MyTabBar : UIImageView @property (nonatomic, assign) id <MyTabBarDelegate> delegate; @end
#import "MyTabBar.h"

#define TABBAR_BTN_START_TAG 100
#define BTN_COUNT 4 @interface TabBarButton : UIButton @end @implementation TabBarButton // 重写高亮的方法。在这个方法中,我们忽略按钮的高亮状态
- (void)setHighlighted:(BOOL)highlighted
{
// NSLog(@"highlighted = %d", highlighted);
// [super setHighlighted:NO];
} @end @interface MyTabBar () // 保存分栏之前选中的按钮
@property (nonatomic, retain) TabBarButton *preSelBtn;
@end @implementation MyTabBar - (instancetype)init
{
if (self = [super init]) {
NSLog(@"init");
} return self;
} // init方法会调用initWithFrame ,给控件添加子控件在initWithFrame中添加
- (instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) { // 1.2 设置背景视图的背景图片
self.image = [UIImage imageNamed:@"tabbg.png"]; // 1.3 设置用户交互属性可用(父控件不能与用户进行交互,则所有子控件都不能与用户交互)
self.userInteractionEnabled = YES; // 2. 在分栏背景上添加按钮
for (int i = ; i < BTN_COUNT; i++) {
TabBarButton *btn = [TabBarButton buttonWithType:UIButtonTypeCustom]; // 设置正常状态下的显示图片
NSString *imageName = [NSString stringWithFormat:@"tab_%d", i];
[btn setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal]; // 设置按钮在选中状态下的显示图片
NSString *imageSelName = [NSString stringWithFormat:@"tab_c%d",i];
[btn setImage:[UIImage imageNamed:imageSelName] forState:UIControlStateSelected]; // 第一个按钮默认为选中
if (i == ) {
btn.selected = YES;
self.preSelBtn = btn;
} // 监听按钮的点击事件
[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchDown]; btn.tag = TABBAR_BTN_START_TAG + i; // 将按钮添加到背景视图上显示
[self addSubview:btn];
}
} return self;
} - (void)btnClick:(TabBarButton *)btn
{
// 1. 取消之前选中按钮的选中状态
self.preSelBtn.selected = NO; // 2. 将当前点击的按钮设为选中状态
btn.selected = YES; // 3. 保存当前选中的按钮
self.preSelBtn = btn; // 如果代理实现了协议方法,通过协议方法通知代码当前控件上的第几个按钮被点击了。
if ([self.delegate respondsToSelector:@selector(tabBar:didSelectItemWithIndex:)]) { [self.delegate tabBar:self didSelectItemWithIndex:btn.tag - TABBAR_BTN_START_TAG];
}
} // 这个方法在控件的frame(大小)修改后被调用
- (void)layoutSubviews
{
// 这行代码不能少
[super layoutSubviews]; // 取出子控件的个数
NSUInteger count = self.subviews.count; // 调整子控件的大小
CGFloat btnY = ;
CGFloat btnW = self.bounds.size.width / count;
CGFloat btnH = self.bounds.size.height; int i = ;
// 取出所有的子控件,调整frame
for (TabBarButton *btn in self.subviews) {
// 设置frame
CGFloat btnX = btnW * i;
btn.frame = CGRectMake(btnX, btnY, btnW, btnH);
i++;
}
}

效果如图:

iOS UITabBarController的使用的更多相关文章

  1. iOS - UITabBarController

    前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UITabBarController : UIViewController <UITabBarDelegate ...

  2. iOS - UITabBarController中的坑

    当你创建一个继承与UITabBarController的子类 并想给其自定义构造方法 传一些值的时候这时候问题出现了: 在创建的时候里面的init方法回调用了 viewdidload,导致每次传值的时 ...

  3. IOS UITabBarController(控制器)的子控制器

    UITabBarController的简单使用 ● UITabBarController的使用步骤 ➢ 初始化UITabBarController ➢ 设置UIWindow的rootViewContr ...

  4. iOS 怎么设置 UITabBarController 的第n个item为第一响应者?

    iOS 怎么设置 UITabBarController 的第n个item为第一响应者? UITabBarController 里面有个属性:selectedIndex @property(nonato ...

  5. iOS开发UI篇—UITabBarController简单介绍

    iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...

  6. IOS开发之路四(UITabBarController)

    前两天看了看斯坦福大学的iphone开发公开课,讲的倒是不错,可看的我云里雾里的,不怎么讲基础和原理,不太适合初学者.今天看了一上午ios5基础教程这本书感觉有点头绪了....废话少说,讲一讲我上午做 ...

  7. iOS开发——实战OC篇&环境搭建之Xib(玩转UINavigationController与UITabBarController)

    iOS开发——实战OC篇&环境搭建之Xib(玩转UINavigationController与UITabBarController)   前面我们介绍了StoryBoard这个新技术,和纯技术 ...

  8. iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController)

    iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController)   这里我们就直接上实例: 一:新建一个项目singleV ...

  9. iOS开发——实战OC篇&环境搭建之StoryBoard(玩转UINavigationController与UITabBarController)

      环境搭建之StoryBoard(玩转UINavigationController与UITabBarController)   研究了这么就IOS开发,都没有所处一个像样或者自己忙一点的项目.最近自 ...

随机推荐

  1. 使用SecureCRT在远程主机和本地之间传输文件

    终于弄明白怎样在SecureCRT的shell里用命令上传下载文件.SecureCRT记住密码的功能容易设置,于是偶这懒人,后来习惯了用 SecureCRT,但其上传文件功能偶一直没弄明白过.之前一直 ...

  2. java中两种添加监听器的策略

    /*第一种:将事件的处理委托给其他对象,下面的例子是委托给了MyListener(implements ActionListener)*/ 1 import java.applet.Applet; i ...

  3. 为 Neutron 准备物理基础设施(I) - 每天5分钟玩转 OpenStack(75)

    前面讨论了 Neutron 的架构和基础知识,接下来就要通过实验深入学习和实践了. 第一步就是准备实验用的物理环境,考虑如下几个问题: 需要几个节点? 如何分配节点的角色? 节点上部署哪些服务? 配几 ...

  4. webapp应用---cordova.js 3.7.0插件安装总结

    今天是2014年的最后一天,年终总结什么的就不写了.记录一下今天的工作内容.如果不知道phoneGap,那么就不需要往下看了,phoneGap现在已经叫cordova了,叫什么不重要,重要的是它对we ...

  5. 设计数据库字段或者java中使用boolean型时需谨慎

    boolean型变量只有两个值 false和true,我们在设计数据库字段时或者定义java变量时会使用boolean,通常情况下开关类的变量使用无可非议,但请一定要考虑到扩展性. 使用前请仔细考虑一 ...

  6. 关于CLR、CIL、CTS、CLS、CLI、BCL和FCL 的区分与总结

    关于CLR.CIL.CTS.CLS.CLI.BCL和FCL 的区分与总结 如果要想深入学习.NET平台,那么标题中的这些关键字对你来说并不陌生,这些名词构成了.NET庞大的生态系统,为了宏观认识.NE ...

  7. 如何在ios中集成微信登录功能

    在ios中集成微信的登录功能有两种方法 1 用微信原生的api来做,这样做的好处就是轻量级,程序负重小,在Build Settings 中这样设置 然后设置 友盟的设置同上,但是要注意,加入你需要的所 ...

  8. Oracle 数据库重放(Database Replay)功能演示

    我们可以捕获生产环境的工作量,在测试环境上重放,从而在不影响生产环境的前提下做一些改动测试. 捕获:需要Oracle版本为10.2.0.4或更高. 重放:需要Oracle版本为11g Release ...

  9. [linux]如何为Virtualbox虚拟硬盘扩容(转载)

    前言 这个教程介绍如何为Virtualbox虚拟硬盘扩容,虚拟硬盘分为动态分配大小和固定虚拟硬盘,扩容的方法不一样: 如何为动态分配的Virtualbox虚拟硬盘扩容 如何为固定大小的Virtualb ...

  10. 4.羽翼sqlmap学习笔记之Post登录框注入

    4.Sqlmap系列教程——post登录框注入注入点: http://xxx.xxx.com/Login.asp 注入方式一: 1.对着注入点使用burp抓包,保存txt格式文件. 2.输入命令: . ...