自己定义UITabBarController
网上大多的自己定义TabBar都是继承View的,项目中要用到path+Tabbat这种话(path用的MMDrawerController这个框架),继承View的Tabbar是无法满足条件的(不是一个容器)。以下就介绍下自己写的一个自己定义TabBar。
和系统自带的写法差点儿相同,先看下原生的写法例如以下:
首先在.h中自己定义一个UITabBarController* tabBarViewController; 接着在.m中来做实现,
tabBarViewController = [[UITabBarController alloc]init];
FirstViewController* first = [[FirstViewController alloc]init];
UINavigationController * navOne = [[UINavigationController alloc] initWithRootViewController:first ];
[navOne setNavigationBarHidden:TRUE];
SecondViewController* second = [[SecondViewController alloc]init];
UINavigationController * navtwo = [[UINavigationController alloc] initWithRootViewController:second ];
[navtwo setNavigationBarHidden:TRUE];
ViewController3 *vc3 = [[ViewController3 alloc] init];
UINavigationController * nav3 = [[UINavigationController alloc] initWithRootViewController:vc3 ];
[nav3 setNavigationBarHidden:TRUE];
ViewController5 *vc5 = [[ViewController5 alloc] init];
UINavigationController * nav5 = [[UINavigationController alloc] initWithRootViewController:vc5 ];
[nav5 setNavigationBarHidden:TRUE];
tabBarViewController.viewControllers = [NSArray arrayWithObjects:navOne, navtwo,nav3,nav5, nil];
[first release];
[second release];
[vc3 release];
[vc5 release];
UITabBar *tabBar = tabBarViewController.tabBar;
UITabBarItem *tabBarItem1 = [tabBar.items objectAtIndex:0];
UITabBarItem *tabBarItem2 = [tabBar.items objectAtIndex:1];
UITabBarItem *tabBarItem3 = [tabBar.items objectAtIndex:2];
UITabBarItem *tabBarItem4 = [tabBar.items objectAtIndex:3];
tabBarItem1.title = @"消息";
tabBarItem2.title = @"应用";
tabBarItem3.title = @"通讯录";
tabBarItem4.title = @"我";
[tabBarItem1 setFinishedSelectedImage:[UIImage imageNamed:@"home_selected.png"] withFinishedUnselectedImage:[UIImage imageNamed:@"home.png"]];
[tabBarItem2 setFinishedSelectedImage:[UIImage imageNamed:@"maps_selected.png"] withFinishedUnselectedImage:[UIImage imageNamed:@"maps.png"]];
[tabBarItem3 setFinishedSelectedImage:[UIImage imageNamed:@"myplan_selected.png"] withFinishedUnselectedImage:[UIImage imageNamed:@"myplan.png"]];
[tabBarItem4 setFinishedSelectedImage:[UIImage imageNamed:@"settings_selected.png"] withFinishedUnselectedImage:[UIImage imageNamed:@"settings.png"]];
UIImage* tabBarBackground = [UIImage imageNamed:@"tabbar.png"];
[[UITabBar appearance] setBackgroundImage:tabBarBackground];
[[UITabBar appearance] setSelectionIndicatorImage:[UIImage imageNamed:@"tabbar_selected.png"]];
[[UITabBarItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
[UIColor whiteColor], UITextAttributeTextColor,
nil] forState:UIControlStateNormal];
UIColor *titleHighlightedColor = [UIColor greenColor];
[[UITabBarItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
titleHighlightedColor, UITextAttributeTextColor,
nil] forState:UIControlStateSelected];
以下来看下自己定义的方法,也是在.h文件里定义
UITabBarController* tabBarViewController;
在定义一个long preSelect变量,这个变量用来推断点击是哪个selectedIndex。
在.m中的详细实现例如以下:
NSMutableArray *arrController = [[NSMutableArray alloc]init];
//信息
MessageViewController *messageVC = [[MessageViewController alloc]initWithNibName:@"MessageViewController" bundle:nil]; UINavigationController * navMessage = [[UINavigationController alloc] initWithRootViewController:messageVC ];
[messageVC release]; [navMessage setNavigationBarHidden:TRUE];
[arrController addObject:navMessage];
[navMessage release];
//应用
AppsViewController *appsVC = [[AppsViewController alloc]initWithNibName:@"AppsViewController" bundle:nil]; UINavigationController *navApps = [[UINavigationController alloc] initWithRootViewController:appsVC];
[appsVC release];
[navApps setNavigationBarHidden:TRUE];
[arrController addObject:navApps];
[navApps release];
//通讯录
AddressViewController *addressVC = [[AddressViewController alloc]initWithNibName:@"AddressViewController" bundle:nil]; UINavigationController *navAddress = [[UINavigationController alloc] initWithRootViewController:addressVC];
[addressVC release];
[navAddress setNavigationBarHidden:TRUE];
[arrController addObject:navAddress];
[navAddress release];
//我
MeViewController *meVC = [[MeViewController alloc]initWithNibName:@"MeViewController" bundle:nil]; UINavigationController *navMe = [[UINavigationController alloc] initWithRootViewController:meVC];
[meVC release];
[navMe setNavigationBarHidden:TRUE];
[arrController addObject:navMe];
[navMe release]; tabBarViewController=[[UITabBarController alloc] init]; tabBarViewController.viewControllers=arrController;
[arrController release];
preSelect = 1;
for (int i = 0; i<4; i++) {
NSString *nalString = [NSString stringWithFormat:@"tabbar_unselecte%d.png", i+1];
NSString *highString = [NSString stringWithFormat:@"tabbar_selected%d.png", i+1];
UIImage *nalImage = [UIImage imageNamed:nalString];
UIImage *highImage = [UIImage imageNamed:highString]; UIButton *tabbarBtn = [UIButton buttonWithType:UIButtonTypeCustom];
tabbarBtn.frame = CGRectMake(i*(320/4), 0, (320/4), 46);
[tabbarBtn addTarget:self action:@selector(tabbarBtnPress:) forControlEvents:UIControlEventTouchUpInside];
[tabbarBtn setBackgroundImage:nalImage forState:UIControlStateNormal];
[tabbarBtn setBackgroundImage:highImage forState:UIControlStateSelected];
tabbarBtn.tag = 100+i;
[tabBarViewController.tabBar addSubview:tabbarBtn]; if (i == 1) {
tabbarBtn.selected = YES;
tabBarViewController.selectedIndex=1;
}
}
主要是思路就是自己定义UITabBarController的tabBar属性,在它上面addSubview。因为加的UIButton,如今就要实现点击
方法来切换。
方法例如以下:
-(void)tabbarBtnPress:(UIButton *)tabbarBtn
{
if (preSelect != tabbarBtn.tag -100 ) { UIButton *prvBtn = (UIButton *)[tabbarBtn.superview viewWithTag:preSelect+100];
prvBtn.selected = NO; tabBarViewController.selectedIndex = preSelect = tabbarBtn.tag-100; UIButton *button = (UIButton *)[tabbarBtn.superview viewWithTag:tabbarBtn.tag];
button.selected = YES;
}
}
到此就完毕了。有什么不正确地方请大家指出来。
5.29日补充:
上面写的是默认是选中第2个tabbar,选中第一个时。仅仅须要改动preSelect =0;和
if(i==0)
{
tabbarBtn.selected =YES;
self.selectedIndex=0;
}
假设想把这个独立出来,仅仅须要定义一个继承UITabBarController的类。
假设想用自己定义的背景也能够 。能够把系统的给隐藏(self.tabBar.hidden =YES;),自己定义一个View,加到tabbar上。[self.view addSubview:xxxx];
,其他还是用上面的方法。
6.3:
发现了一个问题。VC的nav不显示,找了下原因,发现 tabbarController.viewControllers 中设置是VC数组,不是nav数组。
自己定义UITabBarController的更多相关文章
- iOS开发——UI篇Swift篇&UITabBarController
UITabBarController class UITabBarControllerController: UIViewController { var titleString:String! @I ...
- iOS-一个弹出菜单动画视图开源项目分享
相似于Tumblr公布button的弹出视图 使用非常easy: 初始化: @property (nonatomic, strong) XWMenuPopView *myMenuPopView; - ...
- 超文本传输协议-HTTP/1.1
超文本传输协议-HTTP/1.1(修订版) ---译者:孙超进本协议不限流传发布.版权声明Copyright (C) The Internet Society (1999). All Rights R ...
- Snail—UI学习之自己定义标签栏UITabBarController
这里的背景跟上面的差点儿相同 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkF ...
- IOS总结_无需自己定义UITabbar也可改变UITabbarController的背景和点击和的颜色
在application: application didFinishLaunchingWithOptions: launchOptions 增加以下代码就能够实现对tabbar的颜色的改动 //设定 ...
- 自定义UITabBarController标签视图控制器
首先创建一个类,继承自UItabBarController 然后在.m文件中: 这里我有两个宏定义: #define WIDTH (myView.frame.size.width / 4) //我在写 ...
- Swift - 重写UIKit框架类的init初始化方法(以UITabBarController为例)
原来写了篇文章讲UITabBarController的用法,当时是从UIViewController跳转到UITabBarController页面,代码如下: 1 self.presentViewCo ...
- 你真的了解UITabBarController吗?
一:首先查看一下关于UITabBarController的定义 NS_CLASS_AVAILABLE_IOS(2_0) @interface UITabBarController : UIViewCo ...
- iOS学习28之UITabBarController
1. 标签视图控制器 -- UITabBarController 视图(UIView) ---> 图层 ---> 子视图 视图控制器(UIViewController) ---> 管 ...
随机推荐
- 2014 International Conference on Robotics and Computer Vision (ICRVC 2014)
2014机器人与计算机视觉国际会议ICRVC 与会地点:北京 与会时间:2014.10.24-26 截稿日期:2014-07-10 关于征稿: 语言:英文 主题: • Evolutionary Rob ...
- 蓝牙Profile的概念和常见种类
蓝牙Profile Bluetooth的一个很重要特性,就是所有的Bluetooth产品都无须实现全部 的Bluetooth规范.为了更容易的保持Bluetooth设备之间的兼容,Bluetooth规 ...
- 基于JSP+SERVLET的新闻发布系统(三)
拖了这么久..今天把栏目管理还有新闻管理模块的也挂出来.. 栏目管理跟用户管理一样. 这里重点讲解新闻管理. 效果图如上: 1,可选择栏目类别,且栏目类别是动态生成的. 默认生成的文章是未审核状态的. ...
- 03-Foundation中NSMutableArray遍历、复制和排序
目录: 一.NSString补充 二.NSMutableArray可变数组 三.遍历 四.NSArray支持的新语法 五.数组复制 六.数组的排序 SDK.API.Foundation.Cocoa是什 ...
- [ASP.NET]以iTextSharp手绘表格并产生PDF下载
原文 [ASP.NET]以iTextSharp手繪表格並產生PDF下載 大家使用iTextSharp的機緣都不太一樣, 由於單位Crystal Report的License數量有限主管要我去找一個免費 ...
- js导出table到excel,同时兼容FF和IE
前台调用(第一个参数是table的id): <input value="导出" type="button" /> function toExcel( ...
- SDUT 2860-生日Party(BFS)
生日Party Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描写叙述 Sherlock的生日即将来临,Sherlock打算邀请几个好 ...
- CentOS桌面环境如何打开终端以及如何将终端加入右键
安装完CentOS的桌面环境后,默认在桌面以及右键是没有打开终端选项的,要想打开终端,可以由以下步骤: 在左上角菜单[Applications]--->[System Tools]---> ...
- jquery 中获取URL参数的方法
今天写项目需要获取url后面的参数ref参数来判断是否开启计时器来刷新页面,之前一直都是用JS写的,今天在查资料的时候看到了一款JQ的插件 项目地址:https://github.com/allmar ...
- IntelliJ Idea 经常使用快捷键列表
Alt+回车 导入包,自己主动修正Ctrl+N 查找类Ctrl+Shift+N 查找文件Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类和包Alt+Insert 生成代码(如 ...