2011-07-19 13 views
10

Estoy tratando de animar algo donde inicialmente es borroso, luego se enfoca. Supongo que funciona bien, pero cuando termina la animación todavía está un poco borroso. ¿Estoy haciendo esto mal?¿Animar un desenfoque gaussiano usando animación central?

CABasicAnimation* blurAnimation = [CABasicAnimation animation]; 
CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"]; 
[blurFilter setDefaults]; 
[blurFilter setValue:[NSNumber numberWithFloat:0.0] forKey:@"inputRadius"]; 
[blurFilter setName:@"blur"]; 
[[self layer] setFilters:[NSArray arrayWithObject:blurFilter]]; 

blurAnimation.keyPath = @"filters.blur.inputRadius"; 
blurAnimation.fromValue = [NSNumber numberWithFloat:10.0f]; 
blurAnimation.toValue = [NSNumber numberWithFloat:1.0]; 
blurAnimation.duration = 1.2; 

[self.layer addAnimation:blurAnimation forKey:@"blurAnimation"]; 
+0

Solo un FYI para cualquiera que desee hacer esto en iOS ... desafortunadamente aún no es compatible. Con suerte obtendremos esta funcionalidad en el futuro. – user3344977

Respuesta

9

Su problema es que la animación se detiene y se elimina automáticamente, pero el filtro permanece con la más mínima falta de definición aplicada.

Lo que quiere hacer es eliminar el filtro de desenfoque cuando finaliza la animación. Debe agregar un delegado a la instancia CABasicAnimation e implementar el método -[id<CAAnimationDelegate> animationDidStop:finished:].

Si deja que self ser el delegado en este caso, debería ser bastante simple, añadir esta línea antes de añadir la animación a la capa:

blurAnimation.delegate = self; 

Y la devolución de llamada es igualmente simple:

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag { 
    [[self layer] setFilters:nil]; 
} 
2

Si está buscando una manera optimizada de animar un desenfoque, le recomiendo que cree una sola imagen borrosa de su vista y luego decolore la imagen borrosa de alfa 0 a 1 en la parte superior de su vista original. Parece agradable y rápido en las pruebas.