注意:UITabBarController通常作为整个程序的rootViewController,而且不能添加到别的container viewController中
最常见的创建UITabBarController的地方就是在application delegate中的 applicationDidFinishLaunching:方法,因为UITabBarController通常是作为整个程序的rootViewController的,我们需要在程序的window显示之前就创建好它,具体步骤如下:
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"; //实例话页面控制器并附上Title viewController2 = [[SvTabBarFirstViewController alloc] initWithNibName:nil bundle:nil]; viewController2.title = @"Second"; //实例话一个UITaBarController self.tabBarController = [[[UITabBarController alloc] init] autorelease]; self.tabBarController.delegate = self;
//添加uitabBarConterller的所有页面控制器, 有几个页面就要添加几个, 就会显示出分区。 不过不能超过5个,超过的会显示不出来;(下面详解) 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:withFinishedUnselectedImage:方法给选中状态和飞选中状态指定不同的图片。下面看个自己创建UITabBarItem的小例子:
UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:@"Second" image:nil tag:2]; [item setFinishedSelectedImage:[UIImage imageNamed:@"second.png"] withFinishedUnselectedImage:[UIImage imageNamed:@"first.png"]]; viewController2.tabBarItem = item; [item release];此外UITabBarItem还有一个属性badgeValue,通过设置该属性可以在其右上角显示一个小的角标,通常用于提示用户有新的消息,使用很简单,后面有例子。
三、moreNavigationController
UITabBar上最多可以显示5个Tab,当我们往UITabBarController中添加超过的viewController超过5个时候,最后一个一个就会自动变成,按照设置的viewControlles的顺序,显示前四个viewController的tabBarItem,后面的tabBarItem将不再显示。当点击more时候将会弹出一个标准的navigationViewController,里面放有其它未显示的的viewController,并且带有一个edit按钮,通过点击该按钮可以进入类似与ipod程序中设置tabBar的编辑界面。编辑界面中默认所有的viewController都是可以编辑的,我们可以通过设置UITabBarController的customizableViewControllers属性来指定viewControllers的一个子集,即只允许一部分viewController是可以放到tabBar中显示的。但是这块儿要注意一个问题就是每当UITabBarController的viewControllers属性发生变化的时候,customizableViewControllers就会自动设置成跟viewControllers一致,即默认的所有的viewController都是可以编辑的,如果我们要始终限制只是某一部分可编辑的话,记得在每次viewControlles发生改变的时候,重新设置一次customizableViewControllers。
四、UITabBarController的Rotation
UITabBarController默认只支持竖屏,当设备方向放生变化时候,它会查询viewControllers中包含的所有ViewController,仅当所有的viewController都支持该方向时,UITabBarController才会发生旋转,否则默认的竖向。
此处需要注意当UITabBarController支持旋转,而且发生旋转的时候,只有当前显示的viewController会接收到旋转的消息。
五、UITabBar
先说下网络上常见的方式:隐藏原有的TabBar,使用UIView完全重新定义TabBar,这样的好处就是,定制化的程度很高,而且很多东西可以完全推倒重来,但是有一个很严重的问题,当使用 viewController.hidesBottomBarWhenPushed = YES 的时候,还是无法隐藏UITabBar,这个始终无法隐藏,除非采用自定制的动画移开这个UIView或者设置这个为Hidden,,最重要的问题也在这里,所以采用隐藏原有的TabBar的方式之后很多人抱怨无法通过 viewController.hidesBottomBarWhenPushed = YES 来隐藏TabBar,网上有很多类似的代码,我这里就不贴源代码了,问题已经分析出来了
使用自定义UITabBarController, 继承UITabBarController,
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tabbar_background"]];
imageView.frame = CGRectMake(0, 0, self.tabBar.frame.size.width, self.tabBar.frame.size.height);
//contentMode 这个属性是用来设置图片的显示方式,如居中、居右,是否缩放等,UIViewContentModeScaleToFill属性会导致图片变形。UIViewContentModeScaleAspectFit会保证图片比例不变,而且全部显示在ImageView中,这意味着ImageView会有部分空白。UIViewContentModeScaleAspectFill也会证图片比例不变,但是是填充整个ImageView的,可能只有部分图片显示出来。
imageView.contentMode = UIViewContentModeScaleToFill;
[[self tabBar] insertSubview:imageView atIndex:0];
[imageView release];
方法一只能适用于iOS5以下的系统,在iOS5+上面无法使用,所以必须把这两种方法结合起来,当使用viewController.hidesBottomBarWhenPushed = YES,然后再加上[self.navigationControllerpushViewController:ucenter animated:YES];
2.UITabBar自己有一些方法是可以改变自身状态,但是对于UITabBarController自带的tabBar,我们不能直接去修改其状态。任何直接修改tabBar的操作将会抛出异常,下面看一个抛出异常的小例子:
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可以选中moreViewController。
3、viewControllers属性
设置viewControllers属性也会影响当前选中的viewController,设置该属性时UITabBarController首先会清空所有旧的viewController,然后部署新的viewController,接着尝试重新选中上一次显示的viewController,如果该viewController已经不存在的话,会接着尝试选中index和selectedIndex相同的viewController,如果该index无效的话,则默认选中第一个viewController。