Cocoachina介绍Core Animation相关的内容也蛮久的了,这次为大家奉献一个简单点的小程序,但是相信你一定用得着:在程序启动时,使用窗口淡入特效将窗口显示出来;在程序关闭或者窗口关闭时,使用窗口淡出效果将窗口隐藏。

当然,使用这个例子的特效的前提是你的程序是专门为Leopard开发的,如果想在Tiger实现,可能要麻烦点,因为例子中我们使用Core Animation去实现这个特效。

由于这个例子非常简单,而且比较实用,很适合初学者阅读,看看怎么做的然后在你自己的程序中加入这种很酷的效果吧。

这是一个cocoachina.com提供的教学,和往常的教学一样,我们首先在XCode中建立一个Cocoa工程,打开Interface Builder,拽进去一个Object,在Class里改名为AppController,然后在下面的Outlet里点加号,添加一个叫做window的outlet。然后选择File菜单,Write Class…保存为AppController.m和AppController.h。

切回XCode,修改一下AppController.h,让它看起来是这样的:

 

#import <Cocoa/Cocoa.h>

#import <QuartzCore/CoreAnimation.h>

 

@interface AppController : NSObject {

    IBOutlet NSWindow * window;

    BOOL shuttingDown;

}

 

@property (retain) NSWindow * window;

@property BOOL shuttingDown;

@end


我们把id window改成了 NSWindow *window,还增加了一个shuttingDown的布尔值。
 
保存然后切到Interface Builder,按住Ctrl将AppController拽一条线到Window上,选择window,这样,我们就把window和真正的程序窗口连接起来了。
 
接着反过来拽:按住Ctrl将Window拽一条线到AppController上,选择delegate,这个意思是我们的AppController会帮助接收window的消息。因为是要在窗口关闭的时候播放动画嘛,所以我们在程序里自然会用到窗口关闭的消息,通过设置delegate我们就可以在AppController里获取到这个关闭的消息了。
 
同理,我们还需要处理程序退出的消息(你知道,苹果软件关闭窗口和退出程序说的可是两回事),所以也要从Application拽一条线到AppController上,选择delegate。
保存,这里基本上就设置好了,你可以按command+Q关掉Interface Builder了。
 
下面先来做打开窗口时的淡入动画特效,超简单的,你只要在awakeFromNib的时候将window的alphaValue设置成0,再设置成1,窗口就会慢慢显现出来,代码看起来是这样的:
 

self.window.alphaValue = 0.0;

[self.window.animator setAlphaValue:1.0];

 

接着我们该考虑窗口关闭时的情况,由于我们的AppController是window的delegate,所以我们可以接收到这个消息:

 

 

- (BOOL)windowShouldClose:(id)sender

{

[self.window.animator setAlphaValue:0.0];

return NO;

}

 

这里有一个问题,就是其实淡出动画结束时,窗口是没有真正关掉的。要想真正关掉,我们就需要再做点事情,我们需要在awakeFromNib的时候,建立一个CAAnimation的实例:

 

 

CAAnimation *anim = [CABasicAnimation animation];

[anim setDelegate:self];

[self.window setAnimations:[NSDictionary dictionaryWithObject:anim forKey:@"alphaValue"]];

 

将这个anim托管给自己,我们就可以接收到下面这个消息:

 

 

 

- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)flag 

 

这样,在动画结束的时候我们就可以手动将窗口关闭了:

 

 

[self.window close];

 

在程序关闭的时候,窗口虽然关掉了,但是我们是不会接收到windowShouldClose:消息的,这时候我们必须处理这个消息:

 

 

- (NSApplicationTerminateReply) applicationShouldTerminate:(NSNotification *)notification

 

这样,无论在窗口关闭或是程序退出的时候,你都可以给你的Leopard程序这种酷酷的效果了,最关键的是,这一点都不复杂。

 

你可以下载本文这个例子的源程序,记得要用XCode 3.0以上打开,在Leopard中使用。