ios 怎么自定义tabbarios controllerr

&自定义UITabBarController的简单例子
秒后自动跳转到登录页
(奖励5下载豆)
快捷登录:
举报类型:
不规范:上传重复资源
不规范:标题与实际内容不符
不规范:资源无法下载或使用
其他不规范行为
违规:资源涉及侵权
违规:含有危害国家安全等内容
违规:含有反动/色情等内容
违规:广告内容
详细原因:
任何违反下载中心规定的资源,欢迎Down友监督举报,第一举报人可获5-10下载豆奖励。
视频课程推荐
自定义UITabBarController的简单例子
上传时间:
技术分类:
资源评价:
(1位用户参与评价)
已被下载&59&次
将隐藏TabBar改为了符合大家习惯的viewController.hidesBottomBarWhenPushed = YES;- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{ &
if (viewController.hidesBottomBarWhenPushed) &
[leveyTabBarController hidesTabBar:YES animated:YES];
else &nb...
51CTO下载中心常见问题:
1.如何获得下载豆?
1)上传资料
2)评论资料
3)每天在首页签到领取
4)购买VIP会员服务,无需下载豆下载资源
5)更多途径:点击此处
2.如何删除自己的资料?
下载资料意味着您已同意遵守以下协议:
1.资料的所有权益归上传用户所有
2.未经权益所有人同意,不得将资料中的内容挪作商业或盈利用途
3.51CTO下载中心仅提供资料交流平台,并不对任何资料负责
4.本站资料中如有侵权或不适当内容,请邮件与我们联系()
5.本站不保证资源的准确性、安全性和完整性, 同时也不承担用户因使用这些资料对自己和他人造成任何形式的伤害或损失
下载1999次
下载1214次
相关专题推荐
Unity3D是一个让你轻松创作的多平台的
本专题为JavaME手机开发大全视频教程
就目前趋势来看,移动互联网的规模将
去年被Facebook收购的Instagram,最吸
Coding Together: Developing Apps f
本专题由关东升老师讲解,共15讲37课
最有含金量量的iOS培训教程,李明杰老
本专题为传智播客发布的iOS教学视频,
iOS 7是美国苹果公司开发的手机和[1]
本专题为传智播客最新推出的iOS开发进
本专题为关东升老师主讲的iPhone和iP
iOS 具有简单易用的界面、令人惊叹的
本专题为swift语言学习专题,内含有完
关于iPhone SDK和iPhone开发的基础教
iphone开发视频教程iphone开发视频教
本教程为IOS手机端控件级开发的全套视
意见或建议:
联系方式:
您已提交成功!感谢您的宝贵意见,我们会尽快处理43668人阅读
源代码下载地址&
一、自定义的思路
iOS中的TabBarController确实已经很强大了,大部分主流iOS应用都会采用。但是往往也不能满足全部的需求,因此需要自定义TabBar,自定义需要对系统的TabBar工作方式有很好的理解,自定义需要勇气。
自定义TabBar的原则:尽量利用系统自带TabBar,只改需要改的地方。
二、自定义TabBar的总体过程
1.先把自带的TabBar条给取消了
2.自己做一个view,上面放几个按钮,设定按钮的点击事件.并设置selectIndex。
3.关联各个子viewController,覆盖相关事件。
三、细节很重要
1.&让自己创建的按钮关联到viewController:
o用tabbar的selectedIndex属性.设置这个属性就行了.
2.&取消系统的高亮:
o可以自定义一个按钮.重写里面的setHighhighted方法,什么也不做就行了.(如果调用super就相当于没写)
3.&关于几个按钮只选中一个的方法:
o设置一个属性,记录上一个选中的按钮.
o点击当前按钮时,把上一个按钮设置为未选中,并把当前按钮设置为选中,最后把当前按钮赋值给上一个按钮.
四、初步自定义
直接上代码,详见注释。
XNTabBarController.h
#import &UIKit/UIKit.h&
@interface XNTabBarController : UITabBarController
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 XNTabBarController ()
设置之前选中的按钮
@property (nonatomic, weak) UIButton *selectedB
@implementation XNTabBarController
- (void)viewDidLoad {
[super viewDidLoad];
//下面两个方法在开发中是经常会用到的
NSLog(@&%s&,__func__);
NSLog(@&%@&,self.view.subviews); //能打印出所有子视图,和其frame
LogSubviews(self.view);
//删除现有的tabBar
CGRect rect = self.tabBar.
[self.tabBar removeFromSuperview];
//移除TabBarController自带的下部的条
//测试添加自己的视图
UIView *myView = [[UIView alloc] init];
myView.frame =
myView.backgroundColor = [UIColor redColor];
[self.view addSubview:myView];
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 =//设置按钮的标记, 方便来索引当前的按钮,并跳转到相应的视图
//带参数的监听方法记得加&冒号&
[btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
//设置刚进入时,第一个按钮为选中状态
if (0 == i) {
btn.selected = YES;
self.selectedBtn =
//设置该按钮为选中的按钮
自定义TabBar的按钮点击事件
- (void)clickBtn:(UIButton *)button {
//1.先将之前选中的按钮设置为未选中
self.selectedBtn.selected = NO;
//2.再将当前按钮设置为选中
button.selected = YES;
//3.最后把当前按钮赋值为之前选中的按钮
self.selectedBtn =
//4.跳转到相应的视图控制器. (通过selectIndex参数来设置选中了那个控制器)
self.selectedIndex = button.
XNTabBarButton.h
#import &UIKit/UIKit.h&
@interface XNTabBarButton : UIButton
XNTabBarButton.m
#import &XNTabBarButton.h&
@implementation XNTabBarButton
/**什么也不做就可以取消系统按钮的高亮状态*/
- (void)setHighlighted:(BOOL)highlighted{
[super setHighlighted:highlighted];
五、代码重构
重构的目的是把代码放到他最该到的地方去. 提高可读写与可拓展性。
对控件的重构要保证可重用性.&做到封装做其他应用时,可以直接拿过去用的地步.
1、关于init与initWithFrame:
o在对象初始化调用init时,会调用initWithFrame方法.
oInit与initWithFrame都会被调用.
o建议自定义控件不要重写init方法,需要初始化时重写initWithFrame方法.
o好处:其他人调用无论是调用init,还是调用initWithFrame都会调用initWithFrame方法.
2、关于控件的布局代码:
o建议写在layoutSubviews方法中.
o不要忘记写super方法
o将设置x,y,frame等写在这里面.
3、将自定义的Tabbar添加为系统TabBar的子视图,这样TabBar的切换自动隐藏/滑动功能就不用自己做了.
(hidebottombaronpush)
重构后的代码如下:
将自定义的TabBar单独建立,并将代码移过去。
设置代理方法,工具栏按钮被选中,记录从哪里跳转到哪里.&
XNTabBar.h
#import &UIKit/UIKit.h&
@class XNTabB
@protocol XNTabBarDelegate &NSObject&
工具栏按钮被选中, 记录从哪里跳转到哪里. (方便以后做相应特效)
- (void) tabBar:(XNTabBar *)tabBar selectedFrom:(NSInteger) from to:(NSInteger)
@interface XNTabBar : UIView
@property(nonatomic,weak) id&XNTabBarDelegate&
使用特定图片来创建按钮, 这样做的好处就是可扩展性. 拿到别的项目里面去也能换图片直接用
@param image
普通状态下的图片
@param selectedImage 选中状态下的图片
-(void)addButtonWithImage:(UIImage *)image selectedImage:(UIImage *) selectedI
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 XNTabBar ()
设置之前选中的按钮
@property (nonatomic, weak) UIButton *selectedB
@implementation XNTabBar
在这个方法里写控件初始化的东西, 调用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 = //设置按钮的标记, 方便来索引当前的按钮,并跳转到相应的视图
//带参数的监听方法记得加&冒号&
[btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
if (0 == i) {
[self clickBtn:btn];
- (void)addButtonWithImage:(UIImage *)image selectedImage:(UIImage *)selectedImage {
UIButton *btn = [[UIButton alloc] init];
[btn setImage:image forState:UIControlStateNormal];
[btn setImage:selectedImage forState:UIControlStateSelected];
[self addSubview:btn];
//带参数的监听方法记得加&冒号&
[btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
//如果是第一个按钮, 则选中(按顺序一个个添加)
if (self.subviews.count == 1) {
[self clickBtn:btn];
/**专门用来布局子视图, 别忘了调用super方法*/
- (void)layoutSubviews {
[super layoutSubviews];
int count = self.subviews.
for (int i = 0; i & i++) {
//取得按钮
UIButton *btn = self.subviews[i];
btn.tag = //设置按钮的标记, 方便来索引当前的按钮,并跳转到相应的视图
CGFloat x = i * self.bounds.size.width /
CGFloat y = 0;
CGFloat width = self.bounds.size.width /
CGFloat height = self.bounds.size.
btn.frame = CGRectMake(x, y, width, height);
自定义TabBar的按钮点击事件
- (void)clickBtn:(UIButton *)button {
//1.先将之前选中的按钮设置为未选中
self.selectedBtn.selected = NO;
//2.再将当前按钮设置为选中
button.selected = YES;
//3.最后把当前按钮赋值为之前选中的按钮
self.selectedBtn =
//却换视图控制器的事情,应该交给controller来做
//最好这样写, 先判断该代理方法是否实现
if ([self.delegate respondsToSelector:@selector(tabBar:selectedFrom:to:)]) {
[self.delegate tabBar:self selectedFrom:self.selectedBtn.tag to:button.tag];
//4.跳转到相应的视图控制器. (通过selectIndex参数来设置选中了那个控制器)
//self.selectedIndex = button.
原先的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 XNTabBarController () &XNTabBarDelegate&
设置之前选中的按钮
@property (nonatomic, weak) UIButton *selectedB
@implementation XNTabBarController
- (void)viewDidLoad {
[super viewDidLoad];
//下面两个方法在开发中是经常会用到的
NSLog(@&%s&,__func__);
NSLog(@&%@&,self.view.subviews); //能打印出所有子视图,和其frame
// LogSubviews(self.view);
//删除现有的tabBar
CGRect rect = self.tabBar. //这里要用bounds来加, 否则会加到下面去.看不见
LogFrame(self.tabBar);
//[self.tabBar removeFromSuperview];
//移除TabBarController自带的下部的条
//测试添加自己的视图
XNTabBar *myView = [[XNTabBar alloc] init]; //设置代理必须改掉前面的类型,不能用UIView
myView.delegate = //设置代理
myView.frame =
[self.tabBar addSubview:myView]; //添加到系统自带的tabBar上, 这样可以用的的事件方法. 而不必自己去写
//为控制器添加按钮
for (int i=0; i&self.viewControllers. i++) { //根据有多少个子视图控制器来进行添加按钮
NSString *imageName = [NSString stringWithFormat:@&TabBar%d&, i + 1];
NSString *imageNameSel = [NSString stringWithFormat:@&TabBar%dSel&, i + 1];
UIImage *image = [UIImage imageNamed:imageName];
UIImage *imageSel = [UIImage imageNamed:imageNameSel];
[myView addButtonWithImage:image selectedImage: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 =//设置按钮的标记, 方便来索引当前的按钮,并跳转到相应的视图
//带参数的监听方法记得加&冒号&
[btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
//设置刚进入时,第一个按钮为选中状态
if (0 == i) {
btn.selected = YES;
self.selectedBtn =
//设置该按钮为选中的按钮
/**永远别忘记设置代理*/
- (void)tabBar:(XNTabBar *)tabBar selectedFrom:(NSInteger)from to:(NSInteger)to {
self.selectedIndex =
自定义TabBar的按钮点击事件
//- (void)clickBtn:(UIButton *)button {
// //1.先将之前选中的按钮设置为未选中
// self.selectedBtn.selected = NO;
// //2.再将当前按钮设置为选中
// button.selected = YES;
// //3.最后把当前按钮赋值为之前选中的按钮
// self.selectedBtn =
//4.跳转到相应的视图控制器. (通过selectIndex参数来设置选中了那个控制器)
self.selectedIndex = button.
自定义后的效果图:
例子源码下载 :&&
& (觉得还不错的可以给个star)
转载请注明出处:&&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:680421次
积分:6495
积分:6495
排名:第2878名
原创:103篇
转载:16篇
评论:186条
注意:BLOG中难免有错误或遗漏,如有发现敬请指正,谢谢!(不再向CSDN中上传代码)
名言:站在巨人的肩膀上编程。
姓名:徐能
爱好:Games,Coding,乒乓
专注:iOS, cocos2d
文章:31篇
阅读:379817
文章:19篇
阅读:105977
(1)(2)(7)(7)(17)(10)(3)(5)(4)(4)(4)(4)(4)(6)(4)(5)(7)(5)(7)(5)(8)(1)iOS 自定义tabBarController - 推酷
iOS 自定义tabBarController
//& TabBar.m
//& TabBarDemo
//& Created by LeeYunHeNB on 14-10-10.
//& Copyright (c) 2014
XinMaHuTong. All rights reserved.
&TabBar.h&
&TabBarBase.h&
@interface
)UIButton *selectedB
@implementation
)initWithNibName:(NSString *)nibNameOrNil bundle:(
*)nibBundleOrNil
initWithNibName
:nibNameOrNil
:nibBundleOrNil];
// Custom initialization
)viewDidLoad
viewDidLoad
// Do any additional setup after loading the view.
)viewWillLayoutSubviews
tabBarController
隐藏原先的
tabBarViewY =
*& _tabBarView = [[
initWithFrame
CGRectMake
, tabBarViewY,
相关设置在这里
[_tabBarView
setBackgroundColor
addSubview
:_tabBarView];
给按钮添加图片
图片就没加
//& & & & NSString *imageName = [NSString stringWithFormat:@&TabBar%d&, i ];
//& & & & NSString *imageNameSel = [NSString stringWithFormat:@&TabBar%dSel&, i ];
//& & & & [btn setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
//& & & & [btn setImage:[UIImage imageNamed:imageNameSel] forState:UIControlStateSelected];
//& & & & [btn setBackgroundColor:[UIColor greenColor]];
UIControlStateNormal
setTitleColor
UIControlStateSelected
UIControlStateNormal
setTitleColor
UIControlStateSelected
x = i * _tabBarView.
CGRectMake
, _tabBarView.
, _tabBarView.
[_tabBarView
addSubview
设置刚进入时
第一个按钮为选中状态
selectedBtn
设置该按钮为选中的按钮
设置按钮的标记
方便来索引当前的按钮
并跳转到相应的视图
按钮点击事件
(clickBtn:)
forControlEvents
UIControlEventTouchUpInside
)clickBtn:(
selectedIndex
selectedIndex
先将之前选中的按钮设置为未选中
selectedBtn
再将当前按钮设置为选中
最后把当前按钮赋值为之前选中的按钮
selectedBtn
跳转到相应的视图控制器
selectIndex
参数来设置选中了那个控制器
)didReceiveMemoryWarning
didReceiveMemoryWarning
// Dispose of any resources that can be recreated.
//- (void)tabBar:(TabBarBase *)tabBar selectedFrom:(NSInteger)from to:(NSInteger)to {
//& & self.selectedIndex =
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
)prepareForSegue:(
UIStoryboardSegue
*)segue sender:(
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
demo下载路径
http://download.csdn.net/detail/u20471
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致[摘要:自界说View 掩盖到Tabbar上, View没有相应事情题目
原本念等把全部代码皆敲个十遍八遍的,再上去写面轻微面的器械,然则今天碰到一个题目, 本日早晨终究办理了.总算能写]
自定义View 覆盖到Tabbar上, View不响应事件问题
本来想等把所有项目代码都敲个十遍八遍的,再上来写点稍微点的东西,但是昨天遇到一个问题, 今天晚上终于解决了.总算能写篇技术了.
当我们使用TabBarController的时候, 系统自带的TabBar用着不顺手, 我们都会用各种方法自定义一个.
1,有的直接将TabBar隐藏,然后用一个View去覆盖它,在View上添加button. 这种方法缺点就是不能在别的控制器里面 想获取 TabBar一样去随心所欲的获取到它, 比如,在跳转到子控制器的时候, 我们往往需要隐藏底部的&TabBar&, 这时候, 需要考虑隐藏你这个所谓的&TabBar&------------自定义的View,& 但是这时候, 不好获取.很麻烦.
2,直接真正的自定义TabBar, 这种方法我还没有研究.
3, 第一种方法的改进版.在storyboard里面把控制器都处理好, 然后再自定义TabBarController, 并自定义一个View去覆盖TabBar.& 在TabbarController的loadView方法里面创建自定义的View, 然后添加到TabBar里面.
- (void)loadView{
[super loadView];
AMTarbar *mTabbar = [[AMTarbar alloc] initWithFram: self.tabBar.bounds];
[self.tabBar addSubview:mTabbar];
这种方法解决了第一种方法无法轻松的获取到自定义的View问题,& 因为我们直接将View添加到了TabBar里面, 成为了TabBar的子控件,所以就很方便操作了.
但是这种方法只适用于从storyboard里面加载控件时候才行,
不然会出现View上的button按钮无法响应事件..
4,&解决第三种方法,不能在纯代码下实现View响应的问题...
这个问题我了一堆, 也没搞明白,& 我捋了下事件响应的机制,TabBar本身生成的按钮能响应 但是我确确实实点击的是View上面的按钮..所以我怀疑是这个View压根没添加进去(代码模式下). 因为tabbarcontroller的生成上就有特殊性, 他不是线性顺序生成的. 因为他需要根据其他控制器 去生成tabbar上面的按钮.
我打印了下tabbar.subviews, 果然里面根本没有我们自己添加的View, 那也就是说, 当我们在代码模式下, 它的代码执行并不是我们相像的那么简单..知道了问题所在,也就解决了,我们不管他中间干了啥, 我在最后面时候,把View添加到tabbar上就行了.
- (void)viewWillAppear:(BOOL)animated{
AMTarbar *mTabbar = [[AMTarbar alloc] initWithFram: self.tabBar.bounds];
[self.tabBar addSubview:mTabbar];
把LoadView里面的代码拿出来, 放到这个方法里面, 就是在View将要显示的时候, 我再去添加View..测试成功!

我要回帖

更多关于 自定义viewcontroller 的文章

 

随机推荐