一.View Controller Classes
二.自定义UIVIewController
1.创建
a)nib文件
- -
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOp tions:(NSDictionary *)launchOptions - {
-
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; -
// Override point for customization after application launch. -
self.firstViewController = [[[FirstViewController alloc] initWithNibName:@"FirstView" bundle:nil] autorelease]; -
self.window.rootViewController = self.firstViewController; -
self.firstViewController.wantsFullScreenLayout=YES; -
[self.window makeKeyAndVisible]; -
return YES; - }
在调用完后,框架会自动调用controller中的objects(一般是UIView)的awakeFromNib方法,让objects可以有机会来初始化自己.
b)手动创建
只需要alloc&init方式就可以了
2.初始化
一般在controller中实现loadView方法来实现第一次的controller内容的管理,值得注意的是,如果自己实现了这个方法,则不需要调用super的loadView方法
3.设置root view controller的尺寸
a)window的尺寸
b)是否有status bar
c)设备的方向(横向竖向)
d)root view controller的wantsFullScreenLayout属性。这个属性就是设置是否要包含状态栏20像素,比方说你在view里设置了一个button在顶部,这个如果是true,则button出现在状态栏下,如果是false,则会自动顶下去。本身并不影响status bar的隐藏和消失。只是决定status bar下面是否属于程序绘制区域而已。
4.布局
首先可以利用每个view的autoresizingMask的设置来自动布局
viewcontroller布局改变的顺序
a)view controller的vew尺寸改变
b)调用controller的viewWillLayoutSubview.
c)调用view的layoutSubview
d)调用controller的viewDidLayoutSubview.
三.View Controller的生存周期
1.初始化方法:init,initWithCoder;
2.加载controller's view:loadView: controller.view=nil; viewDidLoad: controller.view=view;
3.当收到didREceiveMemoryWarning的时候会调用viewWillUnload,viewDidUnload;
4.dealloc:释放资源(ARC可以忽略)
四.支持界面旋转
1.声明支持的旋转方向
shouldAutorotateToInterf
2.如何处理方向改变
a)方向发生改变
b)调用shouldAutorotateToInterf
c)调用controller的willRotateToInterfaceOri
d)触发view的自动布局(详细的看第二部分的第4点:布局)
e)调用didRotateFromInterfaceOr
3.为每个方向创建不同的界面
利用notification来通知不同的状态。
- @implementation
PortraitViewController - -
(void)awakeFromNib - {
-
isShowingLandscapeView = NO; -
[[UIDevice currentDevice] beginGeneratingDeviceOri entationNotifications]; -
[[NSNotificationCenter defaultCenter] addObserver:self -
selector:@selector(orientationChanged:) -
name:UIDeviceOrientationDidCh angeNotification -
object:nil]; - }
-
- -
(void)orientationChanged:(NSNotification *)notification - {
-
UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation; -
if (UIDeviceOrientationIsLan dscape(deviceOrientation) && -
!isShowingLandscapeView) -
{ -
[self performSegueWithIdentifi er:@"DisplayAlternateView" sender:self]; -
isShowingLandscapeView = YES; -
} -
else if (UIDeviceOrientationIsPor trait(deviceOrientation) && -
isShowingLandscapeView) -
{ -
[self dismissViewControllerAni mated:YES completion:nil]; -
isShowingLandscapeView = NO; -
} - }
4.处理旋转的小贴士
a)暂时禁止任何事件响应
b)存储已经显示的地图区域(地图应用中)
c)如果界面的view层次太过复杂而造成延迟,建议先做view的截图,相关方法我其它博客文章中有提到
d)旋转后,对于tableView的话,需要reload重新读取数据。
e)使用旋转通知来更新应用信息。
五.view显示相关的通知
1.方法有viewWillAppear: viewDidAppear: viewWillDisappear: viewDidAppear:
2.注意这个是controller.view被设置值或者controller.view被设置成nil调用的,当然这个值未必就是直接设置的,可能是通过controller的显示和移除的。
3.知道view显示移除的原因,在上述4个方法中调用isMovingFromParentViewCo
六.viewController显示(关闭)其它viewController
在5.0之前,对应的方法是使用model view controller系列的方法。5.0以后增加了presented,prensentingViewControlle
- FCDemoViewController
*controller= [[FCDemoViewController alloc]initWithNibName:@"FCDemoViewController" bundle:nil]; - controller.modalTransitionStyle=UIModalTransitionStyleFl
ipHorizontal; - [self
presentModalViewControll er:controller animated:YES]; - NSLog(@"%@",self.modalViewController);
- //5.0
- [self
presentViewController:controller animated:YES completion:nil]; - NSLog(@"%@",self.presentedViewController);
- NSLog(@"%@",self.presentingViewController
);
属性modalPresentationStyle在iPad下有几种显示形式,对应不同的显示区域。属性modellTransitionStyle决定过渡形式.
关闭也有对应的方法:dismissModalViewControll
5.0以后其它的变化:
controller可以自定义子controller的集合,这样每一个controller都可以是一个container controller.
definesPresentationConte
详细的操作可以查看class reference.
苹果官方推荐使用协议的方式来让controller相互通信。首先声明一个协议,并在主controller中实现该协议的方法,在显示其它controller的时候,为其设置delegate=self.这样在其它controller需要回调presentingViewController
七.controller的edit mode
1.当设置controller的editing属性,会自动触发setEditing:animated属性,这个时候通过myController editButtonItem获得的编辑按钮会自动从edit变成Done,这个通常使用在navigation Controller
比如设置一个右上角按钮为editButton的话代码如下
- myViewController.navigationItem.rightBarButtonItem=[myViewController
editButtonItem];