CATransition con CIFilter no funciona por primera vez, trabaja por segunda vez
-
08-10-2019 - |
Pregunta
Quiero añadir animación CATransition para NSView. Tengo el siguiente código:
[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
El problema es:
-
ejecuto este código.
-
hago
[[contentView animator] addSubview:mySubview];
por primera vez, no funciona. Sólo aparece la vista. se denominan métodosCATransition
de delegado, pero la banderafinished
es NO (falso). -
I quitar la vista por
[mySubview removeFromSuperview];
y se elimina con la animación, banderafinished
= SI (verdadero). -
Me repetir los pasos 2 y 3 y funciona con la animación. Paso 2 ahora dice que la animación era
finished
(YES). Funciona como se espera.
¿Qué pasa?
Solución
Problema resuelto.
En primer lugar: [contentView setWantsLayer:YES];
, y esto se debe establecer antes de realizar animaciones. Mejor lugar para esto son awakeFromNib
o init
métodos, o algo así. Necesita habilitar Core Animation en contentView
, realice la interfaz de usuario gráfico (me refiero a permitir que su aplicación para hacer esto), y sólo entonces realizar animaciones. En mi caso Habilité Core Animation y realicé la animación de inmediato, y por eso no funcionó para mí.