UITabBarController是IOS中很常用的一个viewController,例如系统的闹钟程序,ipod程序等。UITabBarController通常作为整个程序的rootViewController,而且不能添加到别的container viewController中。
首先我们看一下它的view层级图:
一、手动创建UITabBarController
最常见的创建UITabBarController的地方就是在application delegate中的
1、创建一个UITabBarController对象
2、创建tabbarcontroller中每一个tab对应的要显示的对象
3、通过UITabBarController的viewController属性将要显示的所有content viewcontroller添加到UITabBarController中
4、通过设置UITabBarController对象为window.rootViewController,然后显示window
下面看一个简单的例子:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch.
SvTabBarFirstViewController *viewController1, *viewController2;
viewController1 = [[SvTabBarFirstViewController alloc] initWithNibName:nil bundle:nil]; viewController1.title = @"First"; viewController2 = [[SvTabBarFirstViewControl ler alloc] initWithNibName:nil bundle:nil]; viewController2.title = @"Second"; self.tabBarController = [[[UITabBarController alloc] init] autorelease]; self.tabBarController.delegate = self; self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
[viewController1 release]; [viewController2 release]; self.window.rootViewController = self.tabBarController; [self.window makeKeyAndVisible]; return YES; }
二、UITabBarItem
UITabBar上面显示的每一个Tab都对应着一个ViewController,我们可以通过设置viewcontroller.tabBarItem属性来改变tabbar上对应的tab显示内容。否则系统将会根据viewController的title自动创建一个,该tabBarItem只显示文字,没有图像。当我们自己创建UITabBarItem的时候,我们可以显示的指定显示的图像和对应的文字描述。当然还可以通过setFinishedSelectedImage
UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:@"Second" image:nil tag:2]; [item setFinishedSelectedImage:[UIImage imageNamed:@"second.png"] withFinishedUnselectedIm age:[UIImage imageNamed:@"first.png"]]; viewController2.tabBarItem = item; [item release];
此外UITabBarItem还有一个属性badgeValue,通过设置该属性可以在其右上角显示一个小的角标,通常用于提示用户有新的消息,使用很简单,后面有例子。
三、moreNavigationController
UITabBar上最多可以显示5个Tab,当我们往UITabBarController中添加超过的viewController超过5个时候,最后一个一个就会自动变成,按照设置的viewControlles的顺序,显示前四个viewController的tabBarItem,后面的tabBarItem将不再显示。当点击more时候将会弹出一个标准的navigationViewController
四、UITabBarController的Rotation
UITabBarController默认只支持竖屏,当设备方向放生变化时候,它会查询viewControllers中包含的所有ViewController,仅当所有的viewController都支持该方向时,UITabBarController才会发生旋转,否则默认的竖向。
此处需要注意当UITabBarController支持旋转,而且发生旋转的时候,只有当前显示的viewController会接收到旋转的消息。
五、UITabBar
self.tabBarController = [[[UITabBarController alloc] init] autorelease];
self.tabBarController.delegate = self;
self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, viewController3, nil];
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];
self.tabBarController.tabBar.selectedItem = nil;
上面代码的最后一行直接修改了tabBar的状态,运行程序回得到如下结果:
六、Change Selected Viewcontroller
改变UITabBarController中当前显示的viewController,可以通过一下两种方法:
1、selectedIndex属性
通过该属性可以获得当前选中的viewController,设置该属性,可以显示viewControllers中对应的index的viewController。如果当前选中的是MoreViewController的话,该属性获取出来的值是NSNotFound,而且通过该属性也不能设置选中MoreViewController。设置index超出viewControllers的范围,将会被忽略。
2、selectedViewController属性
通过该属性可以获取到当前显示的viewController,通过设置该属性可以设置当前选中的viewController,同时更新selectedIndex。可以通过给该属性赋值
tabBarController.moreNavigationController
3、viewControllers属性
设置viewControllers属性也会影响当前选中的viewController,设置该属性时UITabBarController首先会清空所有旧的viewController,然后部署新的viewController,接着尝试重新选中上一次显示的viewController,如果该viewController已经不存在的话,会接着尝试选中index和selectedIndex相同的viewController,如果该index无效的话,则默认选中第一个viewController。
七、UITabBarControllerDelega
通过代理我们可以监测UITabBarController的当前选中viewController的变化,以及moreViewController中对编辑所有viewController的编辑。通过实现下面方法:
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController;
该方法用于控制TabBarItem能不能选中,返回NO,将禁止用户点击某一个TabBarItem被选中。但是程序内部还是可以通过直接setSelectedIndex选中该TabBarItem。
下面这三个方法主要用于监测对moreViewController中对view controller的edit操作
- (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers; - (void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewCo ntrollers:(NSArray *)viewControllers changed:(BOOL)changed; - (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewCon trollers:(NSArray *)viewControllers changed:(BOOL)changed;
七、附件UITabBarController测试程序源码
SvTabBarAppDelegate.h这个头文件,折叠后加进去,总是无法展开,望大家见谅!
// // SvTabBarAppDelegate.h // SvTabBarControllerSample// // Created by maple on 5/19/12. // Copyright (c) 2012 smileEvday. All rights reserved. // #import @interface SvTabBarAppDelegate : UIResponder @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) UITabBarController *tabBarController; @end
![UITabBarController使用详解](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
![UITabBarController使用详解](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
// // SvTabBarAppDelegate.m // SvTabBarControllerSample// // Created by maple on 5/19/12. // Copyright (c) 2012 smileEvday. All rights reserved. // #import "SvTabBarAppDelegate.h" #import "SvTabBarFirstViewControl ler.h" #import "SvTabBarSecondViewContro ller.h" @implementation SvTabBarAppDelegate @synthesize window = _window; @synthesize tabBarController = _tabBarController; - (void)dealloc { [_window release]; [_tabBarController release]; [super dealloc]; } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOp tions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. SvTabBarFirstViewControl ler *viewController1, *viewController2, *viewController3; SvTabBarFirstViewControl ler *viewController4, *viewController5, *viewController6; // second kind tabbar controlle SvTabBarSecondViewContro ller *viewController7; // init first tabbarviewcontroller viewController1 = [[SvTabBarFirstViewControl ler alloc] initWithNibName:nil bundle:nil]; viewController1.title = @"First"; // here set text is in vain, because the vc's view is not load //viewController1.contentLbl.text = @"First Tab"; UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btn.frame = CGRectMake(0, 0, 150, 70); btn.center = CGPointMake(160, 120); btn.autoresizingMask = UIViewAutoresizingFlexib leTopMargin | UIViewAutoresizingFlexib leBottomMargin; [btn setTitle:@"Change to Third" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(changToThirdTab) forControlEvents:UIControlEventTouchUpIns ide]; [viewController1.view addSubview:btn]; btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btn.frame = CGRectMake(0, 0, 150, 70); btn.center = CGPointMake(160, 240); btn.autoresizingMask = UIViewAutoresizingFlexib leTopMargin | UIViewAutoresizingFlexib leBottomMargin; [btn setTitle:@"Change to MoreVC" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(changToMoreTab) forControlEvents:UIControlEventTouchUpIns ide]; [viewController1.view addSubview:btn]; btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btn.frame = CGRectMake(0, 0, 150, 70); btn.center = CGPointMake(160, 360); btn.autoresizingMask = UIViewAutoresizingFlexib leTopMargin | UIViewAutoresizingFlexib leBottomMargin; [btn setTitle:@"Set ViewController" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(setTabBarViewController) forControlEvents:UIControlEventTouchUpIns ide]; [viewController1.view addSubview:btn]; viewController2 = [[SvTabBarFirstViewControl ler alloc] initWithNibName:nil bundle:nil]; viewController2.title = @"Second"; btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btn.frame = CGRectMake(0, 0, 150, 70); btn.center = CGPointMake(160, 120); btn.autoresizingMask = UIViewAutoresizingFlexib leTopMargin | UIViewAutoresizingFlexib leBottomMargin; [btn setTitle:@"Change to Fourth" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(changToFourthTab) forControlEvents:UIControlEventTouchUpIns ide]; [viewController2.view addSubview:btn]; btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btn.frame = CGRectMake(0, 0, 150, 70); btn.center = CGPointMake(160, 240); btn.autoresizingMask = UIViewAutoresizingFlexib leTopMargin | UIViewAutoresizingFlexib leBottomMargin; [btn setTitle:@"Set Badge" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(setBadge) forControlEvents:UIControlEventTouchUpIns ide]; [viewController2.view addSubview:btn]; viewController3 = [[SvTabBarFirstViewControl ler alloc] initWithNibName:nil bundle:nil]; viewController3.title = @"Third"; UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:@"#3#" image:nil tag:2]; [item setFinishedSelectedImage :[UIImage imageNamed:@"second.png"] withFinishedUnselectedIm age:[UIImage imageNamed:@"first.png"]]; viewController3.tabBarItem = item; [item release]; viewController4 = [[SvTabBarFirstViewControl ler alloc] initWithNibName:nil bundle:nil]; viewController4.title = @"Fourth"; viewController5 = [[SvTabBarFirstViewControl ler alloc] initWithNibName:nil bundle:nil]; viewController5.title = @"Fifth"; viewController6 = [[SvTabBarFirstViewControl ler alloc] initWithNibName:nil bundle:nil]; viewController6.title = @"Sixth"; // only support portrait interface, so when you add this vc to tabBarcontroller, // the tabbarcontroller will support portrait interface only viewController7 = [[SvTabBarSecondViewContro ller alloc] initWithNibName:nil bundle:nil]; self.tabBarController = [[[UITabBarController alloc] init] autorelease]; self.tabBarController.delegate = self; self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, viewController3, viewController4, viewController5, viewController6, viewController7, nil]; self.tabBarController.customizableViewControll ers = [NSArray arrayWithObjects:viewController1, viewController2, viewController3, viewController4, nil]; [viewController1 release]; [viewController2 release]; [viewController3 release]; [viewController4 release]; [viewController5 release]; [viewController6 release]; [viewController7 release]; self.window.rootViewController = self.tabBarController; [self.window makeKeyAndVisible]; // Directly modifying a tab bar managed by a tab bar controller is not allowed. // self.tabBarController.tabBar.selectedItem = nil; return YES; } - (void)applicationWillResignAct ive:(UIApplication *)application { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. } - (void)applicationDidEnterBackg round:(UIApplication *)application { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate : when the user quits. } - (void)applicationWillEnterFore ground:(UIApplication *)application { // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. } - (void)applicationDidBecomeActi ve:(UIApplication *)application { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } - (void)applicationWillTerminate :(UIApplication *)application { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackg round:. } #pragma mark - #pragma mark Btn action - (void)changToThirdTab { [self.tabBarController setSelectedViewControlle r:[self.tabBarController.viewControllers objectAtIndex:2]]; } - (void)changToFourthTab { [self.tabBarController setSelectedIndex:3]; } // set tabbar viewcontrollers will lead customizableViewControll ers set to default.(equal to viewcontrollers) // so if you want to restrict customizableViewControll ers, you should reset it when viewcontrollers changed - (void)setTabBarViewController { self.tabBarController.viewControllers = self.tabBarController.viewControllers; } // you can just select more tab by set selectedViewController, set selectedIndex is in vain - (void)changToMoreTab { [self.tabBarController setSelectedViewControlle r:self.tabBarController.moreNavigationController ]; // when set more tab selected, the selectedindex will be NSNotFound NSLog(@"%d", self.tabBarController.selectedIndex); } - (void)setBadge { self.tabBarController.selectedViewController.tabBarItem.badgeValue = @"2"; } #pragma mark- #pragma mark UITabBarcontrollerDelega te - (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingView Controllers:(NSArray *)viewControllers { NSLog(@"willBeginCustomizingView Controllers: %@", viewControllers); } - (void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewCo ntrollers:(NSArray *)viewControllers changed:(BOOL)changed { NSLog(@"viewcontrollers: %@, ischanged: %d", viewControllers, changed); } - (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewCon trollers:(NSArray *)viewControllers changed:(BOOL)changed { NSLog(@"didEndCustomizingViewCon troller!"); NSLog(@"didEndCustomizingViewCon troller: %@, ischanged: %d", viewControllers, changed); } - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewControll er:(UIViewController *)viewController { if ([tabBarController.viewControllers indexOfObject:viewController] != 2) { return YES; } return NO; } - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { NSLog(@"didSelectViewController!"); } @end
![UITabBarController使用详解](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
![UITabBarController使用详解](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
![UITabBarController使用详解](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
![UITabBarController使用详解](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
// // SvTabBarFirstViewController.m // SvTabBarControllerSample // // Created by maple on 5/19/12. // Copyright (c) 2012 smileEvday. All rights reserved. // #import "SvTabBarFirstViewControl ler.h" @interface SvTabBarFirstViewControl ler () @end @implementation SvTabBarFirstViewControl ler - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.tabBarItem.image = [UIImage imageNamed:@"first"]; } return self; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.view.backgroundColor = [UIColor whiteColor]; } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. } - (BOOL)shouldAutorotateToInterf aceOrientation:(UIInterfaceOrientation)interfaceOrientation { if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhon e) { return (interfaceOrientation != UIInterfaceOrientationPo rtraitUpsideDown); } else { return YES; } } - (void)willRotateToInterfaceOri entation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { NSLog(@"%@ rotate!", self.title); } - (NSString*)description { return [NSString stringWithFormat:@"title: %@", self.title]; } @end
![UITabBarController使用详解](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
![UITabBarController使用详解](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
// // SvTabBarSecondViewController.h // SvTabBarControllerSample // // Created by maple on 5/19/12. // Copyright (c) 2012 smileEvday. All rights reserved. // #import @interface SvTabBarSecondViewContro ller : UIViewController @end
![UITabBarController使用详解](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
![UITabBarController使用详解](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
// // SvTabBarSecondViewController.m // SvTabBarControllerSample // // Created by maple on 5/19/12. // Copyright (c) 2012 smileEvday. All rights reserved. // #import "SvTabBarSecondViewContro ller.h" @interface SvTabBarSecondViewContro ller () @end @implementation SvTabBarSecondViewContro ller - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.tabBarItem.image = [UIImage imageNamed:@"second"]; } return self; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.view.backgroundColor = [UIColor greenColor]; } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. } - (BOOL)shouldAutorotateToInterf aceOrientation:(UIInterfaceOrientation)interfaceOrientation { //return (interfaceOrientation == UIInterfaceOrientationPo rtrait); return YES; } @end