严格来说,凡是UIView的子类都可以称为视图,实际上IOS的图形界面就是视图包含视图的方案,绝大多数的控件都是UIView的子类,但是苹果公司定义的视图术语,通常是指具有相应视图控制器的uiview及其子类,MVC架构嘛,因此这些视图有时候也被称为内容视图
第一种常见的多视图是基于导航的应用程序,该类程序拥有一个导航控制器,使用导航栏来控制一系列分层的视图,如iphone的设置应用程序,导航控制器跟踪所在的视图深度,并且向你提供控制权,让你可以回到之前的视图,在希望显示具有不同层次结构的视图时就可以使用这种基于导航的应用形式
第二种常见的多视图是标签栏,它在屏幕底部显示一行按钮,称之为标签栏,单击某个按钮就能激活一个新的视图控制器,并显示一个新的视图
另外,这两种视图交换控制机制不是绝对独立的,应为视图本质上是分层的,所以完全可以在一个应用程序中使用不同的视图交换机制,结合标签栏,导航栏一起来对应用程序的逻辑进行控制
一些应用程序使用了工具栏,工具栏的样子和标签栏差不多,但是他们有本质上的区别,标签栏用于从两个或者更多选项中选择一个,而且只能选择一个,工具栏可以包含一些按钮和一些控件
所有的多视图应用程序都是使用的UIKit提供的某个具体的控制器类,比如标签栏界面使用的是UITabBarController类实现,导航界面使用UINavigationController类实现
对于负责管理向当前用户显示哪个界面的的控制器,我们称之为根控制器,这个根控制器通常是UINavigationController或者UITabBarController的子类,也可以是UIViewController的自定义子类
标签栏应用程序中,点击标签栏将会跳转到对应的标签栏控制器中,但是点击屏幕其他位置,都会转到与当前现实的内容视图相对应的控制器中
使用标签栏应用程序,第一步是应用程序委托,在didFinishLuanchingWithOptions函数中将标签控制器作为程序window主控制器,代码如下
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];//创建window self.switchViewController = [[SwitchViewController alloc] initWithNibName:@"SwitchViewController" bundle:nil];//创建主视图控制器 UIView* switchView = self.switchViewController.view;//得到主视图控制器的view CGRect switchViewFrame = switchView.frame;//得到view的frame大小 switchViewFrame.origin.y += [UIApplication sharedApplication].statusBarFrame.size.height; switchView.frame = switchViewFrame;//调整几何属性,以免被隐藏在状态栏后面 self.window.rootViewController = self.switchViewController; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES;
工具栏上的按钮与其他iOS控件不同,他们只支持一个目标动作方法,并且只在特定时刻触发,相当于button的touch upside
当切换标签被按下的时候触发切换方法,同时还应该重新定义viewDidLoad方法,如下
self.blueViewController = [[BlueViewController alloc] initWithNibName:@"BlueViewController" bundle:nil]; [self.view insertSubview:self.blueViewController.view atIndex:0];
切换方法如下
[UIView beginAnimations:@"View" context:NULL]; [UIView setAnimationDuration:0.5]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; if(self.yellowViewController.view.superview == nil) { if(self.yellowViewController == nil) { self.yellowViewController = [[YellowViewController alloc] initWithNibName:@"YellowViewController" bundle:nil]; } [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES]; [self.blueViewController.view removeFromSuperview]; [self.view insertSubview:self.yellowViewController.view atIndex:0]; } else { if(self.blueViewController == nil) { self.blueViewController = [[BlueViewController alloc] initWithNibName:@"BlueViewController" bundle:nil]; } [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES]; [self.yellowViewController.view removeFromSuperview]; [self.view insertSubview:self.blueViewController.view atIndex:0]; } [UIView commitAnimations];
接下来还需要实现didReceiveMemoryWarning方法,当内存减少到一个一个设定的水平的时候,操作系统发送给应用
if(self.blueViewController.view.superview == nil) { self.blueViewController = nil; } else { self.yellowViewController = nil; }
做内存管理
关于视图转换时候的动画效果
iOS的动画效果使用core animation组件,包括
1.
[UIView beginAnimations:@"View" context:NULL];第一个参数为动画块标题,第二个为连接到动画块的对象
2.
[UIView setAnimationDuration:0.5];
指定动画块的持续时间
3.
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
指定动画块效果
4.
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];
指定动画块缓存,这样使用动画块的时候就可以使用这个缓存
5.
[UIView commitAnimations];调用动画块开始执行