2

我想为 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

问题是:

  1. 我执行这段代码。

  2. [[contentView animator] addSubview:mySubview];第一次这样做,它不起作用。视图刚刚出现。CATransition委托方法被调用,但finished标志为 NO(假)。

  3. 我删除视图[mySubview removeFromSuperview];并通过动画删除,finished标志 = YES (true)。

  4. 我重复第 2 步和第 3 步,它适用于动画。第 2 步现在告诉动画是finished(YES)。按预期工作。

怎么了?

4

1 回答 1

2

问题已解决。

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

于 2010-12-06T06:41:08.300 回答