CATransition с CIFilter не работает в первый раз, работает во второй раз - PullRequest
2 голосов
/ 05 декабря 2010

Я хочу добавить анимацию CATransition для NSView.У меня есть следующий код:

[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 НЕТ (ложь).

  3. Я удаляю представление с помощью [mySubview removeFromSuperview];, и он удаляется с анимацией, finished flag = YES(правда).

  4. Я повторяю шаги 2 и 3, и это работает с анимацией.Шаг 2 теперь говорит, что анимация была finished (ДА).Работает как положено.

Что не так?

1 Ответ

2 голосов
/ 06 декабря 2010

Проблема решена.

Прежде всего: [contentView setWantsLayer:YES];, и это необходимо установить перед выполнением анимации.Лучшее место для этого - методы awakeFromNib или init, или что-то вроде этого.Вам нужно включить Core Animation на contentView, выполнить рисование пользовательского интерфейса (я имею в виду, чтобы ваше приложение это делало), и только затем выполнять анимацию.В моем случае я включил Core Animation и сразу же запустил анимацию, и поэтому он у меня не сработал.

...