自己定义UITabBarController

时间:2023-02-23 17:59:20

网上大多的自己定义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的更多相关文章

  1. iOS开发——UI篇Swift篇&amp&semi;UITabBarController

    UITabBarController class UITabBarControllerController: UIViewController { var titleString:String! @I ...

  2. iOS-一个弹出菜单动画视图开源项目分享

    相似于Tumblr公布button的弹出视图 使用非常easy: 初始化: @property (nonatomic, strong) XWMenuPopView *myMenuPopView; - ...

  3. 超文本传输协议-HTTP&sol;1&period;1

    超文本传输协议-HTTP/1.1(修订版) ---译者:孙超进本协议不限流传发布.版权声明Copyright (C) The Internet Society (1999). All Rights R ...

  4. Snail—UI学习之自己定义标签栏UITabBarController

    这里的背景跟上面的差点儿相同 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkF ...

  5. IOS总结&lowbar;无需自己定义UITabbar也可改变UITabbarController的背景和点击和的颜色

    在application: application didFinishLaunchingWithOptions: launchOptions 增加以下代码就能够实现对tabbar的颜色的改动 //设定 ...

  6. 自定义UITabBarController标签视图控制器

    首先创建一个类,继承自UItabBarController 然后在.m文件中: 这里我有两个宏定义: #define WIDTH (myView.frame.size.width / 4) //我在写 ...

  7. Swift - 重写UIKit框架类的init初始化方法(以UITabBarController为例)

    原来写了篇文章讲UITabBarController的用法,当时是从UIViewController跳转到UITabBarController页面,代码如下: 1 self.presentViewCo ...

  8. 你真的了解UITabBarController吗?

    一:首先查看一下关于UITabBarController的定义 NS_CLASS_AVAILABLE_IOS(2_0) @interface UITabBarController : UIViewCo ...

  9. iOS学习28之UITabBarController

    1. 标签视图控制器 -- UITabBarController 视图(UIView) ---> 图层 ---> 子视图 视图控制器(UIViewController) ---> 管 ...

随机推荐

  1. RDD缓存策略

    Spark支持将数据集放置在集群的缓存中,以便于数据重用. Spark缓存策略对应的类: class StorageLevel private( private var useDisk_ : Bool ...

  2. uva 755 - 487--3279

    #include <iostream> #include <string> #include <map> #include <algorithm> #i ...

  3. web works importScripts

    html: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...

  4. 控制结构&lpar;2&rpar; 卫语句&lpar;guard clause&rpar;

    // 上一篇:分枝/叶子(branch/leaf) // 下一篇:状态机(state machine) 基于语言提供的基本控制结构,更好地组织和表达程序,需要良好的控制结构. 典型代码: 同步版本 f ...

  5. PCI和PCIE插槽有什么区别&quest;

    PCI是Peripheral Component Interconnect(外设部件互连标准)的缩写,它是目前个人电脑中使用最为广泛的接口,几乎所有的主板产品上都带有这种插槽.PCI插槽也是主板带有最 ...

  6. mysql 随机数 rand使用

    生成随机数 生成0-3的随机数 SELECT RAND() * 最大不会超过3, SELECT FLOOR(RAND() * ) 上面生成整数的值是0,1,2,3生成的随机整数是1,2,3的话,语句如 ...

  7. Jenkins 定时构建语法规则

    1.Jenkins*风格任务定时构建 2.语法规则 定时构建语法 * * * * * 第一个*表示分钟,取值0~59 第二个*表示小时,取值0~23 第三个*表示一个月的第几天,取值1~31 第四个 ...

  8. TypeScript作业

    题目: 了解神话故事盘古开天辟地或者女娲开世造物,通过typescript程序模拟出天地的变化过程或者万物的衍生过程 参考博客园大神: https://www.cnblogs.com/tansm/p/ ...

  9. jquery原理集合

    人生就是一场梦 完全理解jquery算的是...水平  (jquery常用方法) jQuery分析源码正确方法 详细分析jQuery2.0.3 new的原理 玩转jquery

  10. 自定义redis序列化工具

    redis一个优点就是可以将数据写入到磁盘中. 我们知道写入磁盘的数据实际上都是以字节(0101这样的二进制数据)的形式写入的. 这意味着如果我们要将一个对象写入磁盘,就必须将这个对象序列化. jav ...