2010-12-05 71 views
2

我想为NSView添加CATransition动画。我有以下代码:CIFilter的CATransition不能正常工作,第二次工作

[contentView setWantsLayer:YES]; 
NSRect rect = [contentView bounds]; 

NSData *shadingBitmapData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"restrictedshine" ofType:@"tiff"]]; // took from Apple's example 
NSBitmapImageRep *shadingBitmap = [[[NSBitmapImageRep alloc] initWithData:shadingBitmapData] autorelease]; 
CIImage *inputShadingImage = [[[CIImage alloc] initWithBitmapImageRep:shadingBitmap] autorelease]; 
CIFilter *transitionFilter = [CIFilter filterWithName:@"CIRippleTransition"]; 
[transitionFilter setDefaults]; 
[transitionFilter setValue:[CIVector vectorWithX:NSMidX(rect) Y:NSMidY(rect)] forKey:@"inputCenter"]; 
[transitionFilter setValue:[CIVector vectorWithX:rect.origin.x Y:rect.origin.y Z:rect.size.width W:rect.size.height] forKey:@"inputExtent"]; 
[transitionFilter setValue:inputShadingImage forKey:@"inputShadingImage"]; 

CATransition *presentAnimation = [CATransition animation]; 
[presentAnimation setFilter:transitionFilter]; 
[presentAnimation setDuration:1.0]; 
[presentAnimation setDelegate:self]; 

[contentView setAnimations:[NSDictionary dictionaryWithObject:presentAnimation forKey:@"subviews"]]; 
// maybe there are memory leaks in this code, don't bother at this moment 

的问题是:

  1. 我执行该代码。第一次做[[contentView animator] addSubview:mySubview];,它不起作用。视图刚刚出现。 CATransition调用委托方法,但finished标志为NO(false)。

  2. 我删除了查看[mySubview removeFromSuperview];,它用动画删除,finished flag = YES(true)。

  3. 我重复步骤2和3,它与动画一起使用。第2步现在告诉动画是finished(是)。按预期工作。

怎么了?

回答

2

问题已解决。

首先:[contentView setWantsLayer:YES];,并且在执行动画之前必须设置。更好的地方是awakeFromNibinit方法,或类似的东西。您需要在contentView上启用Core Animation,执行UI绘图(我的意思是允许您的应用程序执行此操作),然后才执行动画。在我的情况下,我启用了Core Animation并立即执行动画,这就是为什么它不适合我。