Split View Controller
类UISplitViewController是一种容器视图控制器用来管理两块信息。第一块面板的宽度固定为320points而高度则为窗口的可视高度。第二志面板则充满了剩余的可视空间。在landscape方向上,splitviewController显示为靠在一起的两块面板其中有一个分隔块。在portrait方向上,则只显示第二块面板并提供toolbar按钮用来使用popover来显示第一块面板。如下图所示:
Split视图的面板包括的内容是通过你所提供viewcontroller进行管理。因为面板包括了应用程序指定的内容,如何管理两个面板之间的交互是由开发者决定。但对于设备的旋转或其它系统相关的行为则是由splitcontroller控制。
Splitviewcontroller必须是你所创建所有界面的根。也就是说,你必须将UISplitViewController所包含的视图作为应用程序窗口的根视图。然后splitview controller的面板可能包括navigationcontroller,Tabbar controller或其它类型的viewcontroller。
最容易将splitview controller集成进应用程序的方法是新建一个工程。XCode中的SplitView-based application模板是创建splitview controller的最好开始。所有要创建splitview controller所需的条件都已俱备。你所要做的就是修改viewcontroller数组来显示你自己要展示的内容。对这些数组的修改对于iphone应用来说虚拟的。所不同的只是你必须有更多的屏幕区域来显示更多的内容。尽管如此,你也可以为你有的应用集成splitview controller。
通过Interfacebuilder创建splitview controller
如果你不想从SplitView-basedapplication模板中新建一个split工程,你仍然可以为你的用户界面增加splitview controller。Interfacebuilder库中包含了splitview controller可以添加到已有的nib中。当添加一个splitview controller,你通常是将其添加到应用程序的主nib文件中。这是因为splitview controller通常是作为你应用程序窗口的最上层的view并可以在启动阶段进行加载。
为应用程序主nib文件添加splitviewcontroller:
1.打开应用程序的主nib文件
2.拖动一个splitview controller到nib文件窗口中。(splitviewcontroller对象包含了两个面板所对应的viewcontroller)
3.在应用程序代理中增加一个splitview controller的outlet并与nib文件中控件进行连接
4.在应用程序代理类的application:didFinishLaunchingWithOptions:方法中将splitview controller的包含的视图作为窗口的主视图
[windowaddSubview:mySplitViewController.view];
5.对于splitview controller面板所包含的viewcontroller:
使用Identityinspector设置viewcontroller所对应的类名
在attributeinspector中,设置viewcontroller中视图所对应的nib文件
设置包括在splitview controller中两个面板中的viewcontroller是开发者的责任。你可以像在应用程序中配置其它viewcontroller一样配置它们。设置viewcontroller对应的类名,以及viewcontroller对应视图的nib文件。剩下的工作就是根据不同的viewcontroller进行相应的配置。
编程方式创建splitview controller
要以编程方式创建splitviewcontroller,先创建UISplitViewController类的一个实例并为其两个面板设置对应的viewcontroller。因为splitview controller的内容只由对应的viewcontroller提供,所以你不需要在创建splitviewcontroller时为其指定nib文件。因此你可以使用init方法对其进行初始化。下面的代码示例了如何在应用程序启动时创建并配置一个splitviewcontroller。你可以用自己定义的viewcontroller来代替缺省的在你应用程序中显示的第一和第二个viewcontroller。
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
2. MyFirstViewController* firstVC = [[[MyFirstViewController alloc] initWithNibName:@"FirstNib" bundle:nil] autorelease];
3. MySecondViewController* secondVC = [[[MySecondViewController alloc] initWithNibName:@"SecondNib" bundle:nil] autorelease];
4.
5. UISplitViewController* splitVC = [[UISplitViewController alloc] init];
6. splitVC.viewControllers = [NSArray arrayWithObjects:firstVC, secondVC, nil];
7.
8. [window addSubview:splitVC.view];
9. [window makeKeyAndVisible];
10.
11. return YES;
12. }
在splitview中支持设备转动
splitview controller信赖于其两个面板中的viewcontroller来决定是否支持设备的转动。如果一个或两个面板中的viewcontroller不支持设备所转动到的新方向,则显示不会有任何改变。这条原则在portrait方向,当第一个viewcontroller隐藏时仍然适用。所以你必须为两个面板中的viewcontroller都重载shouldAutorotateToInterfaceOrientation:方法并返回YES来支持所有方向的转动。
当设备方向发生改变时,splitviewcontroller自动处理大部分转动行为。特别要指出,splitviewcontroller会自动隐藏第一个面板当设备方向转动为portrait时并在设备转动到landscape方向时自动显示第一个面板。
如果你想在portrait方向时显示第一个面板,你就要使用到代理对象。当设置转动到portrait方向时,splitviewcontroller提供其代理一个按钮,点击该按钮,将在popover中显示第一个面板。你应用程序所要完成的是在splitViewController:willHideViewController:withBarButtonItem:forPopoverController:代理方法中将该按钮添加到应用的toolbar上并在splitViewController:willShowViewController:invalidatingBarButtonItem:代理方法中移除该按钮。下面的代码由SplitView-basedapplication模板提供。这些方法在detailview controller中定义,用来管理SplitView controller的第二个面板。
// Called when rotating to a portrait orientation.
2. - (void)splitViewController: (UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController: (UIPopoverController*)pc {
3. barButtonItem.title = @"Root List";
4. NSMutableArray *items = [[toolbar items] mutableCopy];
5. [items insertObject:barButtonItem atIndex:0];
6. [toolbar setItems:items animated:YES];
7. [items release];
8. self.popoverController = pc;
9. }
[plain]view plaincopy
1. // Called when the view is shown again in the split view, invalidating the button and popover controller.
2. - (void)splitViewController: (UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem {
3. NSMutableArray *items = [[toolbar items] mutableCopy];
4. [items removeObjectAtIndex:0];
5. [toolbar setItems:items animated:YES];
6. [items release];
7. self.popoverController = nil;
}