CIFILTERによるカトランションは初めて動作しません、2回目は機能します
-
08-10-2019 - |
質問
NSViewに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
問題は:
このコードを実行します。
そうです
[[contentView animator] addSubview:mySubview];
初めては機能しません。表示が表示されます。CATransition
委任方法は呼び出されますがfinished
フラグはno(false)です。ビューを削除します
[mySubview removeFromSuperview];
そして、それはアニメーションで削除されます、finished
flag = yes(true)。手順2と3を繰り返すと、アニメーションで動作します。ステップ2は、アニメーションがあったことを示しています
finished
(はい)。期待どおりに機能します。
どうしたの?
解決
問題が解決しました。
初めに: [contentView setWantsLayer:YES];
, 、そしてこれはアニメーションを実行する前に設定する必要があります。これにより良い場所です awakeFromNib
また init
方法、またはこのようなもの。コアアニメーションを有効にする必要があります contentView
, 、UIの描画を実行し(アプリにこれを行うことを許可します)、アニメーションを実行します。私の場合、私はコアアニメーションを有効にし、すぐにアニメーションを実行しました。だからこそ、それは私にとってはうまくいきませんでした。
所属していません StackOverflow