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

6.3 标签页控制器UITabBarController
iOS创意程序设计家
相对于导航栏控制器,标签页控制器(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所示的彩色图标,每张图都得包含所有的图标,至于上面图标的高亮度颜色或图形则可以自由设计。通过这样的方式,标签页控制器便由黑白变成彩色的了。

时间: 2024-08-02 09:15:33

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

《iOS创意程序设计家》——第6.4节事件检测

6.4 事件检测 iOS创意程序设计家 界面控制器除了负责界面的管理以及布局外,还负责事件的传递.这些事件包括我们在第5章已经介绍过的触控事件,还有接下来要介绍的晃动检测事件.这些事件都定义在UIResponder类里面,而无论是界面控制器UIViewController还是界面UIView,它们都继承自UIResponder类. 6.4.1 晃动检测 首先,我们来看看晃动事件的处理.与触控事件类似的是,晃动检测也是由一连串的事件所组成的,不过,要让您的应用程序支持晃动检测,必须让您的界面控制器

《iOS创意程序设计家》——第6.2节导航栏控制器UINavigationController

6.2 导航栏控制器UINavigationController iOS创意程序设计家 导航栏控制器(UINavigationController)位于界面的最上方,主要用于将具有因果关系的界面连接起来,它由几个元素组成:左边按钮.右边按钮以及标题.我们可以通过导航栏的navigationItem来访问这3个元素.其中,左右两边的按钮都是UIBarButtonItem类,我们可以通过navigationItem.rightBarButtonItem以及navigationItem.leftBar

《iOS创意程序设计家》——第6.5节Undo与Redo机制

6.5 Undo与Redo机制iOS创意程序设计家还记得第5章在提到UITextView的时候是怎样实现Undo机制的吗?其实,iPhone OS3.0以后就内建了Undo-Redo的机制.在默认的情况下,每一个应用程序的window对象都提供一个NSUndoManager对象,用以管理Undo与Redo的操作,而窗口内的每一个控件也都有其各自的NSUndoManager对象. 这个Undo-Redo机制是怎么运作的呢?首先,它会有两组堆栈(stack),分别用来存放Undo与Redo的操作,而

《iOS创意程序设计家》——第6.1节 界面的管理

6.1 界面的管理iOS创意程序设计家UIViewController提供了对于iOS应用程序的基本界面管理模式,包括界面的呈现.Modal窗口界面的管理以及iOS设备旋转后界面旋转的支持等. 每个UIViewController都会对应到一个唯一的UIView,这表示这个界面由相对应的UIViewCon-troller所控制.如同我们在前一章所提到的,在UIViewController类中,有一个view的属性,而UIViewController正是通过这个属性才得以与其管理的界面关联起来.在

《iOS创意程序设计家》——导读

目 录第1章 从硬件的认识开始第2章 Objective-C语言的基础第3章 开发工具第4章 基本类与机制第5章 界面控件第6章 界面控制器 6.1 界面的管理 6.2 导航栏控制器UINavigationController 6.3 标签页控制器UITabBarController 6.4 事件检测 6.5 Undo与Redo机制 6.6 热身操第7章 操作信息的截取第8章 数据访问与打印第9章 表格控件与Core Data第10章 通讯录第11章 相机与相簿第12章 影音多媒体第13章 定位

【IOS开发必收藏】详解IOS应用程序内使用IAP/STOREKIT付费、沙盒(SANDBOX)测试、创建测试账号流程!【2012-12-11日更新获取”产品付费数量等于0的问题”】

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/550.html //--2012-12-11日更新   获取"产品付费数量等于0这个问题"的原因 看到很多童鞋问到,为什么每次都返回数量等于0?? 其实有童鞋已经找到原因了,原因是你在 ItunesConnect 里的 "Contracts, Tax, and Banking "没

IDA反汇编/反编译静态分析iOS模拟器程序(八)IDA for Mac

iOS多用OC(Objective-C)编程,Mac也类似,所以IDA for Mac对OC的支持似乎强些.Windows的IDA在反汇编某些SDK库文件时会识别不出OC的函数名,而且对OC运行时的结构体也没识别出来.当然,因为我用的是6.1版的windows IDA, Mac上用的是6.4版,不知道是不是windows IDA 6.1的bug了. 总之在界面操作流程上,感觉Mac IDA是对OC有做优化的.当加载一个app时, 会询问是否解析和重命名OC的函数: 如果选择No,所有OC函数都会

IDA反汇编/反编译静态分析iOS模拟器程序(五)F5反编译

反编译是IDA最让人振奋的功能,它的本质是IDA的一个插件,不过会被当做hex-rays的另一个产品.既然是产品,那当然就另外收费,demo版是没有的.反编译的快捷键是F5,菜单位置在 顶部菜单View->Open Subviews->Pseudocode.(有网友问到为什么按照第一篇的地址下载IDA后也没有F5,最终是发现他自己装了python,设了环境变量,这会令IDA工作不正常) 在显示反汇编的窗口中按F5,经过分析后,会多了一个标签栏Pseudocode-A: 继续上一节(可用两个浏览

ios闹钟程序-iOS闹钟程序实现的过程

问题描述 iOS闹钟程序实现的过程 求iOS闹钟程序实现的过程,不要是早几年的,新版本的,感激不尽,非常感谢 解决方案 http://download.csdn.net/detail/u012524508/6431991