书以严密的体系性提供了iPhone和iPad软件开发从入门到专家的系统性知识,并提供来源于真实项目的可重用商业代码。书中的每个实例都是项目经验的提炼,深入浅出地讲解iPhone和iPad软件开发的核心技术要点,基本涵盖了iOS软件开发在真实商业项目中所需要的所有主题,并将实例介绍的技术深度和超值的实用性结合在一起,成为本书的特色。
![]() ![]() 下面为大家连载此书部分章节供大家讨论。 iPhone SDK开发基础之iPhone程序框架 总的来说iPhone程序有两类框架,一类是游戏框架,另一类是非游戏框架,这里介绍的是非游戏框架,即基于iPhone 用户界面标准控件的程序框架。 典型的iPhone程序包含一个Window和几个UIViewController,每个UIViewController管理多个UIView(可能是UITableView、UIWebView、UIImageView等),如图3-24所示。这些UIView之间如何进行层次迭放、显示、隐藏、旋转、移动等都由UIViewController进行管理,而UIViewController之间的切换,通常情况是通过UINavigationController、UITabBarController或UISplitViewController进行切换。接下来笔者会逐一介绍如何使用这三种Controller来切换你的UIViewController,以及在UIViewController中如何组织和管理你的各种UIView。 ![]() 图3-24 iPhone程序框架示意图 iPhone SDK开发基础之 OpenFlow编程 当用户界面需要按页面显示图片时,使用OpenFlow库提供的功能,将要显示的用户界面图片分页进行显示会使编程工作变得非常快捷。该库提供了与OS X桌面Finder程序相同的视觉效果,如图3-46所示就是一个使用OpenFlow库逐页进行图片显示的程序,用户按下屏幕即可进行左右滚动显示,双击图片即可对当前显示的图片进行选取操作。 ![]() 图3-46 OpenFlow编程实例界面 程序在视图控制器的viewDidAppear()中使用refreshCoverFlow()函数初始化OpenFlow库,通过setNumberOfImages()函数设置图片数量,代码如下。 // RootViewController.m - (void)refreshCoverFlow{ CGRect bounds = [[UIScreen mainScreen] bounds]; AFOpenFlowView *coverFlowView = (AFOpenFlowView*)[self.view viewWithTag:kTagCoverflow]; if(coverFlowView != nil) [coverFlowView removeFromSuperview]; coverFlowView = [[AFOpenFlowView alloc] initWithFrame:CGRectMake(0, -30, bounds.size.width, COVERFLOWHEIGHT)]; coverFlowView.dataSource = self; coverFlowView.viewDelegate = self; coverFlowView.defaultImage = [self defaultImage]; coverFlowView.tag = kTagCoverflow; [self.view addSubview:coverFlowView]; NSInteger count = [self numberOfAnimals]; [coverFlowView setNumberOfImages:count]; //... [coverFlowView release]; } 并在loadView()中初始化图片,将图片从资源中加载并保存在一个NSMutableArray类型的变量imageArray中,代码如下。 - (BOOL)doAddAnimal:(NSString *)name Image:(NSString *)imageName{ UIImage *image = [UIImage imageNamed: imageName]; if(image == nil) return FALSE; CGSize size = CGSizeMake(179, 208); [imageArray addObject:[self resizeImage:image scaledToSize:size]]; return TRUE; } 在OpenFlow库的requestImageForIndex delegate方法中直接通过NSMutableArray的索引作为OpenFlow库的图片索引,并通过该索引设置和获取具体图片,代码如下。 // PageViewController.m - (void)openFlowView:(AFOpenFlowView *)openFlowView requestImageForIndex: (int)index{ UIImage *image = [imageArray objectAtIndex:index]; [openFlowView setImage:image forIndex:index]; } 笔者在OpenFlow库AFOpenFlowView.m文件的touchesEnded()函数中增加了双击回调接口,以便在用户双击图片时通知库的调用者,代码如下。 //AFOpenFlowView.m - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { if(((UITouch *)[touches anyObject]).tapCount == 2){ if ([self.viewDelegate respondsToSelector:@selector(openFlowView: coverViewDoubleClick:)]) [self.viewDelegate openFlowView:self coverViewDoubleClick: selectedCoverView.number]; } [super touchesEnded:touches withEvent:event]; } 库的调用者RootViewController类通过接口函数coverViewDoubleClick()即可处理用户双击事件,代码如下。 - (void)openFlowView:(AFOpenFlowView *)openFlowView coverViewDoubleClick:(int)index{ NSLog(@"coverViewDoubleClick called!"); [self showPaintingViewController]; } 本节相关的完整Xcode工程源代码文件请参考本书附带的光盘中的OpenFlow工程。 |
|
|
|
|
|
iPhone SDK开发基础之
使用UITabBarController组织和管理UIView 当你的程序分为几个相对比较独立的部分时,就比较适合使用UITabBarController来组织用户界面,如图3-26所示。 ![]() 图3-26 UITabBarController程序框架实例界面 在屏幕的下方包含UITabBarController的三个按钮,用户单击不同的按钮即可以进入不同的界面,每个界面相对来说在整个系统中比较独立,也就是程序分成了三个相对比较独立的不同部分,在每个相对独立的部分你也可以使用UINavigationController等容器类组织你的界面。这样组织使程序逻辑非常清晰,当然你也可以组织很多个Tab而不只是三个,以下代码演示如何创建UITabBarController对象,并为其添加多个Tab。 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions { // Override point for customization after application launch. //Create the navigation Controller UINavigationController *localNavigationController; //Create UINavigationController tabBarController = [[UITabBarController alloc] init]; tabBarController.delegate = self; // Create the array that will contain all the View controlelr NSMutableArray *localControllersArray = [[NSMutableArray alloc] init WithCapacity:3]; // Create the view controller attached to the first item in the TabBar aViewController *firstViewController; firstViewController = [aViewController alloc]; localNavigationController = [[UINavigationController alloc] initWithRoot ViewController:firstViewController]; localNavigationController.navigationBar.barStyle = UIBarStyleBlackOpaque; [localNavigationController.tabBarItem initWithTitle:@"Outlines" image:[UIImage imageNamed:@"webcast.png"] tag:1]; firstViewController.navigationItem.title = @"Outlines"; [localControllersArray addObject:localNavigationController]; [localNavigationController release]; [firstViewController release]; // Create the view controller attached to the second item in the TabBar anotherViewController *secondViewController; secondViewController = [[anotherViewController alloc] initWithStyle: UITableViewStyleGrouped ]; localNavigationController = [[UINavigationController alloc] initWithRoot ViewController:secondViewController]; [localNavigationController.tabBarItem initWithTitle:@"Q & A" image:[UIImage imageNamed:@"book.png"] tag:2]; secondViewController.navigationItem.title=@"Q & A"; [localControllersArray addObject:localNavigationController]; [localNavigationController release]; [secondViewController release]; miscViewController *thirdViewController; thirdViewController = [[miscViewController alloc] initWithStyle:UITable ViewStyleGrouped ]; localNavigationController = [[UINavigationController alloc] initWithRoot ViewController:thirdViewController]; [localNavigationController.tabBarItem initWithTitle:@"Misc" image:[UIImage imageNamed:@"favorites.png"] tag:3]; thirdViewController.navigationItem.title=@"Misc"; [localControllersArray addObject:localNavigationController]; [localNavigationController release]; [thirdViewController release]; // load up our tab bar controller with the view controllers tabBarController.viewControllers = localControllersArray; // release the array because the tab bar controller now has it [localControllersArray release]; // add the tabBarController as a subview in the window [window addSubview:tabBarController.view]; // need this last line to display the window (and tab bar controller) [window makeKeyAndVisible]; return YES; } 捕获Tab切换事件,获取当前活动的Tab索引和UIViewController对象,代码如下。 - (void)tabBarController:(UITabBarController *)barController didSelectView Controller:(UIViewController *)viewController{ NSLog(@"currentController index:%d",viewController, tabBarController.selectedIndex); UIViewController *currentController = tabBarController.selectedView Controller; NSLog(@"currentController: %@",currentController); } 切换不同的Tab时,只需要设置UITabBarController的selectedIndex属性即可,代码如下。 tabBarController.selectedIndex = 2; 本节相关的完整Xcode工程源代码文件请参考本书附带的光盘中的Lessons2实例。 本文节选自《iOS软件开发揭密:iPhone&iPad企业应用和游戏开发》一书。 《iOS软件开发揭密:iPhone&iPad企业应用和游戏开发》一书已由电子工业出版社正式出版,本书由虞斌著。 | |
|
|
|
|
|
|