《精彩iPhone炫酷开发》试读:1.3.3 编写视图控制器

视图控制器管理所有图形,包括动画。你已经在游戏类中见过对视图控制器的调用,现在来重点分析它的一些代码。 以下方法是从游戏对象直接调用的。从这些方法名就能清楚地看出它们的作用: - (void)zoomInCenterwithColor:(int)color andShape:(int)shape; - (void)zoomOutCenter; - (void)moveCenterToCircle:(int)circle; - (void)zoomInCircle:(int)circle withColor:(int)color andShape:(int)shape; - (void)updateTimer:(int)timervalue; - (void)updateLives:(int)lives; - (void)updateScore:(int)points; 所有视图(除了背景视图)都是简单的图像或标签视图。在 Frenzic 中,还有一个有脉动功能的派生图像视图。除此以外,与 Formic 类似,Frenzic 也只是使用了现成的 Cocoa 视图。 视图控制器中的方法都非常相似,因为它们都使用相同的基本概念来实现动画和显示视图。这些动画的原则就是修改视图的一个属性,如位置、可见度或视图大小,并在一个给定的时间帧内通过动画完成这个修改,而不是立即改变视图的属性。 要开始一个动画,只需使用以下方法: [UIView beginAnimations:nil context:nil]; 之后,设置动画的持续时间: [UIView setAnimationDuration:DURATION]; 接下来改变视图属性。要真正开始动画,需要用以下代码行结束代码块: [UIView commitAnimations]; 以下给出一个例子,要让一个视图淡入,需要将该视图的可见度值(alpha value)设置为0.0,并将它增加到视图层次结构,然后将其可见度值通过动画改变为 1.0。这就会创建一个淡入效果: VIEW.alpha = 0.0; [MASTERVIEW addSubview:VIEW]; [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:ANIM_NORMAL]; VIEW.alpha = 1.0; [UIView commitAnimations]; 以下视图属性可以实现动画: ■ frame、bounds 和 center(即位置); ■ alpha(即可见度); ■ transform(即大小)。 可以结合所有这些动画,从而创建出可以在 Formic(和 Frenzic)中看到的丰富绚丽的动画。 有时,Formic 还包含一些复杂的、多层次的动画。其中一个动画是将棋子从中间移至指定的外围圆盘位置,然后随着新棋子的淡入,将外围圆盘中匹配的棋子淡出。Frenzic 中也有这种复杂的动画,例如,有一个动画是桔块移出到圆盘,稍稍上提,然后当移到圆盘上方时下落。 对于这些复杂的动画,必须相继完成多个动画。为此,一种做法是调度执行一个方法(这在前面已经提到过): [self performSelector:@selector(animationDidStop:) withObject:PARAMETER afterDelay:DURATION]; 另一种做法是在动画块中的 beginAnimations 和 commitAnimations 之间设置动画委托和选择器,如下所示: [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector:@selector(animationDidStop:finish:)]; 由于这需要多加两行代码,另外还有一个 finish: 参数,而这个参数在大多数情况下并没有太大用处,所以我更倾向于使用 performSelector:WithObject:afterDelay:。 代码清单 1-8 包含了 Formic 的两个方法,它们通过具体代码来展示这些多层次的动画。 代码清单 1-8 构成一个复杂动画的两个方法 - (void)moveCenterToCircle:(int)circle { // 在这里动画 [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:ANIM_NORMAL]; mCenterView.alpha = 1.0; mCenterView.transform = CGAffineTransformMakeScale (0.95, 0.95); mCenterView.center = [(FormicView *)[self view] centerForCircle:circle]; [UIView commitAnimations]; // 转移和调度 mMovedView = mCenterView; mCenterView = nil; [self performSelector:@selector(clearCircle:) withObject: [NSNumber numberWithInt:circle]afterDelay:ANIM_NORMAL]; } - (void)clearCircle:(NSNumber *)number { int circle = [number intValue]; // 将内棋子和外棋子动画淡出 [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:ANIM_NORMAL]; mMovedView.alpha = 0.0; mMovedView.transform = CGAffineTransformMakeScale (0.33, 0.33); mCircleView[circle].alpha = 0.0; mCircleView[circle].transform = CGAffineTransformMakeScale (3.0, 3.0); [UIView commitAnimations]; // 并将其删除 [mMovedView release]; mMovedView = nil; [mCircleView[circle] release]; mCircleView[circle] = nil; // 然后移入新棋子 [[AppDelegate game] newPieceForCircle:[NSNumber numberWithInt:circle]]; 使用这些动画时要有些创意。例如,可以再创建一个视图,以便在实际视图上方增加一些效果。在 Formic 中得一分或者丢一条命时,让数字看上去就像是飞出去一样。为达到这种效果,需要在视图上面增加一个副本,并为其添加在增加大小的同时淡出的动画。

>精彩iPhone炫酷开发

精彩iPhone炫酷开发
作者: [美] Gary Bennett, Wolfgang Ante, Mike Ash, Benjamin Jackson, Neil Mix, Steven Peterson, Matthew "Canis" Rosenfeld
副标题: 七位一线高手的编程和设计范例
原作名: iPhone Cool Projects: Learn the Coding Secrets of Master iPhone Designers and Developers
isbn: 7115236518
书名: 精彩iPhone炫酷开发
页数: 204
译者: 苏金国, 王小振 等
定价: 59.00元
出版社: 人民邮电出版社
装帧: 平装
出版年: 2010-10