//
// 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的更多相关文章

  1. 自定义tabBar

    ★★★★自定义tabBar★★★★★★★ Demo下载地址:https://github.com/marlonxlj/tabBarCustom.git 前言: 有的时候需求要对tabBar进行自定义的 ...

  2. IOS第二天-新浪微博 - 添加搜索框,弹出下拉菜单 ,代理的使用 ,HWTabBar.h(自定义TabBar)

    ********HWDiscoverViewController.m(发现) - (void)viewDidLoad { [super viewDidLoad]; // 创建搜索框对象 HWSearc ...

  3. iOS 隐藏自定义tabbar

    iOS  隐藏自定义tabbar -(void)viewWillAppear:(BOOL)animated { NSArray *array=self.tabBarController.view.su ...

  4. iOS开发之功能模块--关于自定义TabBar条

    只上项目中用到的代码: 1.实现重写TabBar的TabBarItem,然后在中间额外加一个按钮. #import <UIKit/UIKit.h> @interface BikeTabBa ...

  5. iOS开发项目之四 [ 调整自定义tabbar的位置与加号按钮的位置]

    自定义tabbar与按钮的添加 01 - 把系统的tabbar用我们自己的覆盖 LHQTabBar *lhqTabBar = [[LHQTabBar alloc]init]; [self setVal ...

  6. 关于自定义tabBar时修改系统自带tabBarItem属性造成的按钮顺序错乱的问题相关探究

      关于自定义tabBar时修改系统自带tabBarItem属性造成的按钮顺序错乱的问题相关探究 测试代码:http://git.oschina.net/Xiyue/TabBarItem_TEST 简 ...

  7. 第二篇、Swift_自定义 tabbar 的 badgeValue显示样式

    在实际的开发中,我们常常需要根据实际的需求,去改变bageValue的显示样式,默认是红色的背景,白色的字体颜色 使用方式: class BKTabBarController: UITabBarCon ...

  8. [iOS微博项目 - 1.6] - 自定义TabBar

    A.自定义TabBar 1.需求 控制TabBar内的item的文本颜色(普通状态.被选中状态要和图标一致).背景(普通状态.被选中状态均为透明) 重新设置TabBar内的item位置,为下一步在Ta ...

  9. 1行代码为每个Controller自定义“TabBar”-b

    这篇文章大致会带你实现以下的功能,废话少说,先看东西: JPNavigationController.gif Q&A:Demo里都有那些东西? 01.关于自定义导航栏 01.第一个控制器的导航 ...

  10. iOS 轻松实现自定义TabBar

    自定义TabBar的案例网上不少,昨天受到开发小伙伴的影响,尝试了一下非大神的取巧思路:Demo 1.创建RootViewController,后面创建几个继承的VC,将这几个VC添加到TabBarC ...

随机推荐

  1. 【JAVA版】Storm程序整合Kafka、Mongodb示例及部署

    一.环境 一台Centos6.5主机 Mongo 3.0 Kafka_2.11-0.8.2.1 Storm-0.9.5 Zookeeper-3.4.6 java 1.7 (后因在mac上打包的jar由 ...

  2. <Araxis Merge>快速一览文件的比较与合并

    重要的文件比较与合并特性在下面都指出了.对每个特性的说明性内容在下面可以找到. 注意:只有双向的比较/合并被展示了,专业版的Merge还支持三向的比较/合并. 1.文件夹比较按钮 单击这个工具栏按钮会 ...

  3. NotePad++ delphi/Pascal函数过程列表插件

    从cnpack上爬下来的 函数过程列表 点击下载

  4. URL的格式scheme

    url scheme: scheme + (://) + userinfo + (@) + hostname + (:) + port + path + (?) + query + (#) + fra ...

  5. mysql performance_schema 初探

    mysql  performance_schema 初探: mysql 5.5 版本 新增了一个性能优化的引擎: PERFORMANCE_SCHEMA 这个功能默认是关闭的: 需要设置参数: perf ...

  6. 在Dashboard中显示课表/日程表

    对于使用Mac系统的朋友们来说,Dashboard一定并不陌生.通过Dashboard我们可以方便地添加小组件,查看日历,天气,便签等等.然而,这些都是“定制”的内容.如何在Dashboard中显示自 ...

  7. POJ 1789 Truck History (最小生成树)

    Truck History 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/E Description Advanced Carg ...

  8. JPA project Change Event Handler问题解决[转]

    转至:http://my.oschina.net/cimu/blog/278724 这是Eclipse中的一个GUG: Bug 386171 - JPA Java Change Event Handl ...

  9. Unity3D之UGUI学习笔记(一):UGUI介绍以及Canvas

    UGUI是Unity3D4.6官方提供的UI系统,支持2D和3D UI的开发. Unity3D UI史 OnGUI 在Unity4.6之前,官方提供的是OnGUI函数来开发UI界面,当然问题也比较多, ...

  10. Java中重写与重载的辨析

    摘要:在我们学习Java过程中,重写与重载使我们在面向对象里要学习的重要知识点之一,那我们看看它们有那些区别: 一.重写 1.概念:简单的说就是子类将从父类继承而来的方法重新实现一次. 2.特点: ① ...