6.1 多视图应用程序的常见类型
视图术语,通常指具有相应视图控制器的UIView或其子类,这些视图类型也称为内容视图。
常见的多视图类型有:
基于标签栏的应用程序 UITabBarController
基于导航栏的应用程序 UINavigationController
在ipad上,大部分基于导航的应用程序使用分割视图 split view
注意区分工具栏和标签栏,工具栏仅仅是底部放置了一系列工具控件的控件而已。
?
6.2 多视图应用程序的体系结构
根控制器:应用程序的主视图控制器,它负责管理当前向用户显示哪个视图。
这个根控制器通常是UINavigationController或UITabBarController或者其他自定义UIViewController
内容视图:每个内容视图至多由三部分组成,控制器,nib文件,UIView子类;
每个视图控制器控制着一个内容视图。
6.3 UINavigationController
使用Empty Application模版创建应用程序,这个模版提供了一个应用程序委托,其中有个UIWindow属性。
注意,每个应用程序仅拥有一个属于它的窗口。
1.创建控制器
创建根视图控制器 BIDSwitchViewController,不自动创建xib文件
创建两个内容视图控制器BIDBlueViewController,BIDYellowViewController
都不自动创建xib,后面手动创建,手动关联,是为了更好的理解controller和xib的关联
2.创建xib文件
command+n, 选中user interface, 选择view模版,这将创建一个带由内容视图的xib文件
名称为SwitchView.xib, BlueView.xib, YellowView.xib
3.修改应用程序委托
使用SwitchView.xib初始化BIDSwitchViewContrller,并且设置其为应用程序委托窗口的根视图控制器。
self.switchViewController = [[BIDSwitchViewController alloc]
initWithNibName:@"SwitchView" bundle:nil];
self.window.rootViewController = self.switchViewController;
4.在根视图控制器中,添加内容视图
// BIDSwitchViewController.h
@property (strong, nonatomic) BIDYellowViewController *yellowViewController;
@property (strong, nonatomic) BIDBlueViewController *blueViewController;
5.修改手动创建的xib文件
手动创建的xib文件,起初不知道其File’s Owner的具体类型,所以需要设置
command+option+3 打开身份检查器,修改其File‘s Owner类型为 BIDSwitchViewController
UIViewController中有个view输出口,修改了xib文件的拥有者类型后,还需要将控制器的view输出口关联到xib文件的View。
之所以创建xib文件的时候其内部不自动关联,是因为其File‘s Owner默认类型为NSObject,无view输出口
6.构建带有工具栏的视图
从对象库中,拖出一个Toolbar,放置到view底部,并关联其按钮的动作方法switchViews
(现在应该搞清楚了,toolbar只是一个控件类型,而标签栏是一个可以容纳不同视图的视图控制器)
7.修改根视图控制器
- (void)viewDidLoad
{
[super viewDidLoad];
if (self.blueViewController == nil) {
self.blueViewController = [[BlueViewController alloc] initWithNibName:@"BlueViewController" bundle:nil];
}
if (self.yellowViewController == nil) {
self.yellowViewController = [[YellowViewController alloc] initWithNibName:@"YellowViewController" bundle:nil];
}
//起初显出蓝色视图
[self.view insertSubview:self.blueViewController.view atIndex: 0];
}
//切换视图
- (IBAction)switchViews:(UIBarButtonItem *)sender
{
if (self.yellowViewController.view.superview == nil) {
//注意,移出父视图,是通过自己
[self.blueViewController.view removeFromSuperview];
//插入父视图,是通过父视图add
[self.view insertSubview:self.yellowViewController.view atIndex:0];
}else {
[self.yellowViewController.view removeFromSuperview];
[self.view insertSubview:self.blueViewController.view atIndex:0];
}
}
注意,视图insertSubview:atIndex并且插入到0的位置,意思是将其放在其他所有子视之后,作为背景视图
避免遮住了前面创建的工具栏子视图。
8.实现内容视图
添加button,添加action方法
注意,虽然是简单的view切换,但是每个view视图,都是由一个视图控制器所拥有的。
9.视图转换过程的动画效果
UIView中,有几个类方法用于制定视图转换过程中,是否使用动画效果,指定转换类型和转换过程的持续时间。
为了告诉IOS,我们希望在转换过程中使用动画效果,需要声明一个动画块,并指定动画持续的时间。
beginAnimations:context:
第一个参数,动画块标题
第二个参数是一个void*指针
比如:
[UIView beginAnimations:@"Flip View" context:nil];//设置动画块标题
[UIView setAnimationDuration:1.25];//设置持续时间
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];//设置动画曲线
应该始终对动画进行缓存,除非视图外观在动画执行过程中需要改变
//设置转换类型
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];
//…视图转换
。。。
//合成动画
[UIView commitAnimations];
从beginAnimations开始到最后commitAnimations之间的所有动作,都会被制成动画。
总结:
initWithNibName
insertSubview
removeFromSuperview