2010-12-05 14 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. 私はこのコードを実行し、私は次のコードを持っています。

  2. 私は初めて[[contentView animator] addSubview:mySubview];を実行しますが、動作しません。ビューが表示されます。 CATransition代理メソッドが呼び出されますが、finishedフラグはNO(偽)です。

  3. [mySubview removeFromSuperview];でビューを削除し、アニメーションで削除すると、フラグ= YES(真)になります。

  4. 手順2と3を繰り返して、アニメーションと連動します。ステップ2では、アニメーションがfinished(YES)であることがわかりました。期待どおりに動作します。

何が問題なのですか。

答えて

2

問題が解決しました。

まず、[contentView setWantsLayer:YES];とこれをアニメーションを実行する前に設定する必要があります。これのためのより良い場所はawakeFromNibまたはinitのメソッド、またはこのようなものです。 contentViewでCore Animationを有効にし、UI描画を実行して(つまり、アプリにこれを許可する)、アニメーションのみを実行する必要があります。私の場合、Core Animationを有効にしてすぐにアニメーションを実行したので、それが私のためにはうまくいかなかったのです。

関連する問題