完全自定义 TabBar
//
// CustomTabBarController.h
// Dream
//
// Created by mac on 14-10-17.
// Copyright (c) 2014年 HM. All rights reserved.
// //标记一下方向
typedef enum
{
ZYSlideDirectionRight = ,
ZYSlideDirectionLeft } ZYSlideDirection; #import <UIKit/UIKit.h> @interface CustomTabBarController : UIViewController<UINavigationControllerDelegate>
{
UIView *_myTabBarView;
}
@property (retain, nonatomic) NSArray *viewControllers;
@property (retain, nonatomic) NSArray *previousNavViewController;
@property (retain, nonatomic) NSArray *buttonArray;
@property (retain, nonatomic) NSArray *normalImageArray;
@property (retain, nonatomic) NSArray *highLightImageArray;
@property (retain, nonatomic) NSArray *nameArray;
@property (assign, nonatomic) int selectedIndex; - (instancetype)initWithNormalImage:(NSArray *)normalImageArray highLightImage:(NSArray *)highLightImageArray BtnName:(NSArray *)nameArray; - (void)tabBarButtonClick:(id)sender; - (void)showTabBar:(ZYSlideDirection)direction animated:(BOOL)isAnimated;
- (void)hideTabBar:(ZYSlideDirection)direction animated:(BOOL)isAnimated; @end
//
// CustomTabBarController.m
// Dream
//
// Created by mac on 14-10-17.
// Copyright (c) 2014年 HM. All rights reserved.
// //动画持续时间,该时间与压栈和出栈时间相当
#define SLIDE_ANIMATION_DURATION 0.33 #import "CustomTabBarController.h"
#import "Header.h" @interface CustomTabBarController ()
@property (retain, nonatomic) NSArray *labArray;
@property (retain, nonatomic) NSArray *imageArray;
@end @implementation CustomTabBarController - (void)dealloc
{
[_myTabBarView release];
self.viewControllers = nil;
self.normalImageArray = nil;
self.highLightImageArray = nil;
self.nameArray = nil;
self.previousNavViewController = nil;
self.buttonArray = nil;
self.labArray = nil;
self.imageArray = nil;
[super dealloc];
} - (instancetype)initWithNormalImage:(NSArray *)normalImageArray highLightImage:(NSArray *)highLightImageArray BtnName:(NSArray *)nameArray
{
if (self = [super init])
{
_selectedIndex = -;
self.normalImageArray = normalImageArray;
self.highLightImageArray = highLightImageArray;
self.nameArray = nameArray; }
return self;
} - (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view. self.view.backgroundColor = [UIColor whiteColor]; _myTabBarView = [[UIView alloc]initWithFrame:CGRectMake(, , , )];
[self.view addSubview:_myTabBarView]; UIImageView *image = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"adv_bottom.png"]];
image.frame = CGRectMake(, , , );
[_myTabBarView addSubview:image];
[image release]; NSMutableArray *arrayB = [NSMutableArray array];
NSMutableArray *arrayI = [NSMutableArray array];
NSMutableArray *arrayL = [NSMutableArray array]; for (int i = ; i < _nameArray.count; i ++)
{
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(+*i, , , );
btn.tag = i;
// [btn setImage:[UIImage imageNamed:_normalImageArray[i]] forState:UIControlStateNormal];
// [btn setImage:[UIImage imageNamed:_highLightImageArray[i]] forState:UIControlStateSelected];
[btn addTarget:self action:@selector(tabBarButtonClick:) forControlEvents:UIControlEventTouchUpInside];
[_myTabBarView addSubview:btn];
[arrayB addObject:btn]; UIImageView *imageView= [[UIImageView alloc]initWithFrame:CGRectMake(, , , )];
imageView.image = [UIImage imageNamed:_normalImageArray[i]];
imageView.highlightedImage = [UIImage imageNamed:_highLightImageArray[i]];
[btn addSubview:imageView]; [arrayI addObject:imageView];
[imageView release]; UILabel *lab = [[[UILabel alloc]init] autorelease];
lab.text = _nameArray[i];
lab.textAlignment = NSTextAlignmentCenter;
lab.font = [UIFont systemFontOfSize:];
lab.frame = CGRectMake(, , , );
[btn addSubview:lab]; [arrayL addObject:lab];
[lab release];
}
self.buttonArray = arrayB;
self.imageArray = arrayI;
self.labArray = arrayL; if (_selectedIndex == -)
{
self.selectedIndex = ;
}
else
{
self.selectedIndex = _selectedIndex;
} } - (void)setSelectedIndex:(int)selectedIndex
{
//如果索引值没有改变不做其他操作
if (_selectedIndex == selectedIndex) return; if (_selectedIndex >= )
{
//找出对应索引的视图控制器
UIViewController *priviousViewController = [_viewControllers objectAtIndex:_selectedIndex];
//移除掉
[priviousViewController.view removeFromSuperview]; UIButton *btn = _buttonArray[_selectedIndex];
btn.selected = NO; UILabel *lab = _labArray[_selectedIndex];
lab.textColor = [UIColor blackColor]; UIImageView *image = _imageArray[_selectedIndex];
image.image = [UIImage imageNamed:_normalImageArray[_selectedIndex]]; } //记录一下当前的索引
_selectedIndex = selectedIndex; //获得对应的按钮并且设置为高亮状态下的图片
UIButton *currentButton = _buttonArray[_selectedIndex];
currentButton.selected = YES;
UILabel *lab = _labArray[_selectedIndex];
lab.textColor = PINK(0.6);
UIImageView *image = _imageArray[_selectedIndex];
image.image = [UIImage imageNamed:_highLightImageArray[_selectedIndex]]; //获得对应的视图控制器
UIViewController *currentViewController = [_viewControllers objectAtIndex:_selectedIndex]; //如果此条件成立表示当前是第一个,即“导航控制器”
if ([currentViewController isKindOfClass:[UINavigationController class]])
{
//设置导航控制器的代理
((UINavigationController *)currentViewController).delegate = self;
}
//设置当前视图的大小
currentViewController.view.frame = CGRectMake(, , , self.view.bounds.size.height - ); //添加到Tab上
[self.view addSubview:currentViewController.view]; //把视图放到TabBar下面
[self.view sendSubviewToBack:currentViewController.view]; } - (void)tabBarButtonClick:(id)sender
{
//获得索引
UIButton *btn = (UIButton *)sender;
int index = (int)btn.tag; //用self.赋值默认会调set方法
self.selectedIndex = index;
} #pragma mark -
#pragma mark UINavigationControllerDelegate - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
// NSLog(@"vc is %@",viewController);
/*
第一次加载根视图:previousNavViewController当前导航控制器里面的视图控制器数组
之后显示视图:previousNavViewController操作前的视图控制器数组
*/
if (!_previousNavViewController)
{
//导航控制器中的视图数组
self.previousNavViewController = navigationController.viewControllers;
} /*
是否为压栈的标记,初始化为NO
如果原来的控制器数不大于当前导航的视图控制器数表示是压栈
*/
BOOL isPush = NO; if ([_previousNavViewController count] <= [navigationController.viewControllers count])
{
isPush = YES;
} /*
上一个视图控制器当压栈的时候底部条是否隐藏
当前视图控制器当压栈的时候底部条是否隐藏
这两个视图控制器有可能是同一个
*/
BOOL isPreviousHidden = [[_previousNavViewController lastObject] hidesBottomBarWhenPushed]; BOOL isCurrentHidden = viewController.hidesBottomBarWhenPushed;
// [[navigationController.viewControllers lastObject] hidesBottomBarWhenPushed] //重新记录当前导航器中的视图控制器数组
self.previousNavViewController = navigationController.viewControllers; /*
如果状态相同不做其他操作
如果上一个显示NO,这个隐藏YES,则隐藏TabBar
如果上一个隐藏YES,这个显示NO,则显示TabBar
*/
if (!isPreviousHidden && !isCurrentHidden)
{
return;
}
else if(isPreviousHidden && isCurrentHidden)
{
return;
}
else if(!isPreviousHidden && isCurrentHidden)
{
//隐藏tabbar 压栈
[self hideTabBar:isPush ? ZYSlideDirectionLeft : ZYSlideDirectionRight animated:animated];
}
else if(isPreviousHidden && !isCurrentHidden)
{
//显示tabbar 出栈
[self showTabBar:isPush ? ZYSlideDirectionLeft : ZYSlideDirectionRight animated:animated];
} } /*
显示底部TabBar相关
需要重置当前视图控制器View的高度为整个屏幕的高度-TabBar的高度
*/
- (void)showTabBar:(ZYSlideDirection)direction animated:(BOOL)isAnimated
{
//根据压栈还是出栈设置TabBar初始位置
CGRect tempRect = _myTabBarView.frame;
tempRect.origin.x = self.view.bounds.size.width * ( (direction == ZYSlideDirectionRight) ? - : );
_myTabBarView.frame = tempRect; //执行动画
[UIView animateWithDuration:isAnimated ? SLIDE_ANIMATION_DURATION : delay: options: animations:^
{
//动画效果
CGRect tempRect = _myTabBarView.frame;
tempRect.origin.x = ;
_myTabBarView.frame = tempRect; }
completion:^(BOOL finished)
{
//动画结束时
//重置当前视图控制器View的高度为整个屏幕的高度-TabBar的高度
UIViewController *currentViewController = [_viewControllers objectAtIndex:_selectedIndex]; CGRect viewRect = currentViewController.view.frame;
viewRect.size.height = self.view.bounds.size.height - ;
currentViewController.view.frame = viewRect;
}];
} /*
隐藏底部TabBar相关
需要重置当前视图控制器View的高度为整个屏幕的高度
*/
- (void)hideTabBar:(ZYSlideDirection)direction animated:(BOOL)isAnimated
{
//获得当前视图控制器
UIViewController *currentViewController = [_viewControllers objectAtIndex:_selectedIndex];
//重置高度
CGRect viewRect = currentViewController.view.frame;
viewRect.size.height = self.view.bounds.size.height;
currentViewController.view.frame = viewRect; //设置TabBar的位置
CGRect tempRect = _myTabBarView.frame;
tempRect.origin.x = ;
_myTabBarView.frame = tempRect; //采用Block的形式开启一个动画
[UIView animateWithDuration:isAnimated ? SLIDE_ANIMATION_DURATION : delay: options: animations:^(void)
{
//根据压栈还是出栈设置动画效果
CGRect tempRect = _myTabBarView.frame;
tempRect.origin.x = self.view.bounds.size.width * (direction == ZYSlideDirectionLeft ? - : );
_myTabBarView.frame = tempRect; }
completion:^(BOOL finished){}
];
} @end
完全自定义 TabBar的更多相关文章
- 自定义tabBar
★★★★自定义tabBar★★★★★★★ Demo下载地址:https://github.com/marlonxlj/tabBarCustom.git 前言: 有的时候需求要对tabBar进行自定义的 ...
- IOS第二天-新浪微博 - 添加搜索框,弹出下拉菜单 ,代理的使用 ,HWTabBar.h(自定义TabBar)
********HWDiscoverViewController.m(发现) - (void)viewDidLoad { [super viewDidLoad]; // 创建搜索框对象 HWSearc ...
- iOS 隐藏自定义tabbar
iOS 隐藏自定义tabbar -(void)viewWillAppear:(BOOL)animated { NSArray *array=self.tabBarController.view.su ...
- iOS开发之功能模块--关于自定义TabBar条
只上项目中用到的代码: 1.实现重写TabBar的TabBarItem,然后在中间额外加一个按钮. #import <UIKit/UIKit.h> @interface BikeTabBa ...
- iOS开发项目之四 [ 调整自定义tabbar的位置与加号按钮的位置]
自定义tabbar与按钮的添加 01 - 把系统的tabbar用我们自己的覆盖 LHQTabBar *lhqTabBar = [[LHQTabBar alloc]init]; [self setVal ...
- 关于自定义tabBar时修改系统自带tabBarItem属性造成的按钮顺序错乱的问题相关探究
关于自定义tabBar时修改系统自带tabBarItem属性造成的按钮顺序错乱的问题相关探究 测试代码:http://git.oschina.net/Xiyue/TabBarItem_TEST 简 ...
- 第二篇、Swift_自定义 tabbar 的 badgeValue显示样式
在实际的开发中,我们常常需要根据实际的需求,去改变bageValue的显示样式,默认是红色的背景,白色的字体颜色 使用方式: class BKTabBarController: UITabBarCon ...
- [iOS微博项目 - 1.6] - 自定义TabBar
A.自定义TabBar 1.需求 控制TabBar内的item的文本颜色(普通状态.被选中状态要和图标一致).背景(普通状态.被选中状态均为透明) 重新设置TabBar内的item位置,为下一步在Ta ...
- 1行代码为每个Controller自定义“TabBar”-b
这篇文章大致会带你实现以下的功能,废话少说,先看东西: JPNavigationController.gif Q&A:Demo里都有那些东西? 01.关于自定义导航栏 01.第一个控制器的导航 ...
- iOS 轻松实现自定义TabBar
自定义TabBar的案例网上不少,昨天受到开发小伙伴的影响,尝试了一下非大神的取巧思路:Demo 1.创建RootViewController,后面创建几个继承的VC,将这几个VC添加到TabBarC ...
随机推荐
- Codevs No.1281 Xn数列
2016-06-01 16:28:25 题目链接: Xn数列 (Codevs No.1281) 题目大意: 给定一种递推式为 Xn=(A*Xn-1+C)%M 的数列,求特定的某一项%G 解法: 矩阵乘 ...
- android 拍照或者图库选择 压缩后 图片 上传
通过拍照或者从相册里选择图片通过压缩并上传时很多应用的常用功能,记录一下实现过程 一:创建个临时文件夹用于保存压缩后需要上传的图片 /** * path:存放图片目录路径 */ private Str ...
- 为Elasticsearch添加中文分词
Elasticsearch的中文分词很烂,所以我们需要安装ik.首先从github上下载项目,解压: cd /tmp wget https://github.com/medcl/elasticsear ...
- POJ 3321 Apple Tree (树状数组+dfs序)
题目链接:http://poj.org/problem?id=3321 给你n个点,n-1条边,1为根节点.给你m条操作,C操作是将x点变反(1变0,0变1),Q操作是询问x节点以及它子树的值之和.初 ...
- JFinal搭建时,提示着不到contextpath
出项类似html截断现象 原因:此处是由于html不识别contextPath上下文所造成.其根本原因是html中使用contextPath与configHandler中加载的不一致造成(basePa ...
- transition:all 0.5s linear;进度条动画效果 制作原理
Html: <span class="progress"><b ><i></i></b><em>50< ...
- MVC神韵---你想在哪解脱!(十二)
追加一条电影信息 运行应用程序,在浏览器中输入“http://localhost:xx/Movies/Create”,在表单中输入一条电影信息,然后点击追加按钮,如图所示. 点击追加按钮进行提交,表单 ...
- C语言快排
C语言使用快排的方式有两种,1.直接用库函数stdlib.h里的qsort函数 2.自己编写快排代码(第一种方便,第二种较为自由) qsort 的函数原型是:void qsort(void*base, ...
- PostgreSQL的schema信息,存储于何处
查看schema信息: [pgsql@localhost bin]$ ./psql psql () Type "help" for help. pgsql=# create sch ...
- DuiVision开发教程(17)-对话框
DuiVision的对话框类是CDlgBase. 代码中假设须要创建一个对话框,一般建议使用DuiSystem类中封装的若干对话框相关的函数来操作,包括创建对话框.删除对话框.依据对话框名获取对话框指 ...