《iOS创意程序设计家》——第6.3节标签页控制器UITabBarController

    xiaoxiao2023-12-23  27

    本节书摘来自异步社区《iOS创意程序设计家》一书中的第6章,第6.3节标签页控制器UITabBarController,作者 林柏全,更多章节内容可以访问云栖社区“异步社区”公众号查看

    6.3 标签页控制器UITabBarControlleriOS创意程序设计家相对于导航栏控制器,标签页控制器(UITabBarController)是将几个具有独立功能的界面使用Tab分隔开来,并定义在界面的下方。这些界面会存放在一个数组里面,而里面每个元素则是UIView-Controller的类,当然也可以包括导航栏UINavigationController在内。可以通过viewControllers属性或是setViewControllers: animated:方法来设置标签页控制器所控制的界面。

    在使用标签页控制器的时候,难免会碰到要使用的标签页过多的情况,这时候,标签页控制器会自动产生一个More的标签页,所有超出界面范围的标签页都会放到这个标签页所包含的界面控制器中。可以通过moreNavigationController属性来取得这个界面控制器。

    当标签页被选中之后,可以通过selectedViewController属性来取得选中的界面控制器,或是通过selectedIndex来取得或设置选中的标签页索引值。

    与大多数控件一样,标签页控制器也是通过代理者来处理相关的事件的。可以通过delegate属性来指定它的代理者(该代理者必须实现UITabBarControllerDelegate),以处理以下的事件。

    用来决定某个标签页是否可以选中 - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController; 标签页选中后会触发的事件 - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController; 通知代理者标签页位置即将开始调整 - (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers 通知代理者标签页位置即将结束调整 - (void)tabBarController:(UITabBarController *)tabBarController  willEndCustomizingViewControllers:(NSArray *)viewControllers  changed:(BOOL)changed; 通知代理者标签页位置已调整完毕 -(void)tabBarController:(UITabBarController *)tabBarController  didEndCustomizingViewControllers:(NSArray *)viewControllers  changed:(BOOL)changed;

    由于用户可能在执行期间改变标签页的顺序,您可以通过代理者来检测到这个变化。

    在XCode中产生一个标签页的应用程序十分简单,尤其是通过故事板的方式。现在就让我们建立一个Tabbed Application的应用程序吧。

    请记得勾选“Use Storyboard”以及“Use Automatic Reference Counting”选项。产生后的应用程序会默认产生两个标签页。如果不需要它们,那么可以直接在设计界面中选中该界面后删除它。

    由于每个标签页都表示一个界面,因此每个界面都会有一个相对应的界面控制器。因此,接下来,我们要为新的标签页产生一个新的界面控制器。

    首先,先添加一个UIViewController的类,并命名为“ThirdViewController”。在产生的过程中请不要勾选“With XIB for user interface”这个选项。从控件库拉进一个View Controller,并在标识查看窗口(identity inspector)中选择ThirdViewController为这个界面控制器的类。现在,界面上已经有3个界面控制器了,不过我们的标签页却只有两个。因此,我们需要产生第3个标签页。连接标签页与界面控制器以产生新的标签页。产生新标签页的方式与前面连接的方式一样,只要在Tab Bar Controller按住“Control”键不放,然后拉到新的界面控制器上就可以了。这时候你会看到Storyboard Segues的窗口中多了一个“Relationship – viewControllers”的选项,选择这个选项后即可增加一个新的标签页,如图6.12所示。

    现在,可以在新的界面控制器上直接点选标签页的标题,并修改上面的文字。标签页应用程序的产生大致上就是这样,非常简单吧!

    注意:注意:如果想要在标签页上使用自己设计的图标,您可以在iOS Human Interface Guidelines中找到相关的规定。标签页的图标约为3030(或6060),且必须是黑白的。这是因为系统会在该标签页选中时动态地将黑色部分涂成高亮度的颜色,如果将图标设计成彩色的,整个图标会挤成一团。虽然按照官方的做法,标签页的图标只能使用黑白色,不过,通过一些技巧,我们仍然可以做到彩色图标的效果。这个技巧的原理是通过贴图的方式贴到标签页控制器的上面,因此原来的标签页上的图标与文字都要消除掉,并且让每张图的大小恰好可以完整地遮住标签页控制器。接着,我们便可以将AppDelegate.m的程序代码修改如下:

    -(BOOL)application:(UIApplication *)application   didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {   UITabBarController *tab = (UITabBarController *)                 self.window.rootViewController;   tab.delegate = self;   return YES; } -(void)tabBarController:(UITabBarController *)tabBarController   didSelectViewController:(UIViewController *)viewController {   // 先删除已加入的图片   for(UIView *view in tabBarController.tabBar.subviews) {     if([view isKindOfClass:[UIImageView class]]) {       [view removeFromSuperview];     }   }   // 再加入相对应的图片   UIImage *image = [UIImage imageNamed:            [NSString stringWithFormat:            @"Tab0%i",tabBarController.selectedIndex+1]];   UIImageView *tab = [[UIImageView alloc] initWithImage:image];   [tabBarController.tabBar addSubview:tab]; }

    然后准备好如图6.13所示的彩色图标,每张图都得包含所有的图标,至于上面图标的高亮度颜色或图形则可以自由设计。通过这样的方式,标签页控制器便由黑白变成彩色的了。

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)