2012-05-15 13 views
10
  • crear un proyecto simple en XCode
  • vista
  • conjunto para recibir eventos multi-touch
  • responder de touchesBegan, crean CALayer al detectar eventos táctiles
  • hacer una opacidad fundido de salida de animación para CALayer
  • cuando parada de animación, eliminar CALayer de padres

esperar: CALayer desaparecen normalmenteiPhone: eliminar CALayer cuando parada de animación, CALayer flash antes de desaparecer

real: Flash CALayer (abrir y cerrar) antes de desaparecer

código fuente completo:

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    self.view.multipleTouchEnabled = YES; 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
} 

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    for (UITouch* touch in touches) { 
     CGPoint p = [touch locationInView:self.view]; 

     //NSLog(@"touch=%@ p=%@", touch, NSStringFromCGPoint(p)); 

     CALayer *layer = [CALayer layer]; 
     layer.position = p; 
     layer.bounds = CGRectMake(0, 0, 70, 70); 
     layer.cornerRadius = 30; 
     layer.masksToBounds = NO; 
     layer.backgroundColor = [UIColor colorWithRed:102.0/255.0 green:156.0/255.0 blue:255.0/255.0 alpha:0.8].CGColor; 
     layer.shouldRasterize = YES; 

     CABasicAnimation *fadeOutAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
     fadeOutAnimation.fromValue = [NSNumber numberWithFloat:1.0]; 
     fadeOutAnimation.toValue = [NSNumber numberWithFloat:0.0]; 
     fadeOutAnimation.duration = 0.5; 
     fadeOutAnimation.delegate = self; 
     fadeOutAnimation.removedOnCompletion = NO; 
     [fadeOutAnimation setValue:layer forKey:@"parentLayer"]; 
     [layer addAnimation:fadeOutAnimation forKey:@"opacity"]; 

     [self.view.layer addSublayer:layer]; 
    } 
} 

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag { 
    if(flag) { 
     CALayer *layer = [theAnimation valueForKey:@"parentLayer"]; 
     if(layer) { 
      layer.opaque = NO; 
      layer.opacity = 0.0; 
      //layer.hidden = YES; 
      //NSLog(@"The layer object was: %@ (%@)", layer, [layer name]); 
      [layer removeFromSuperlayer]; 
      [layer removeAllAnimations]; 
     } 
    } 
} 

@end 
+0

¿cuál es tu problema? – Dev

+0

+1 para "Esperar: ... real: ..." –

Respuesta

13

tl; dr: Establecer la fillMode en la animación a kCAFillModeForwards o cambiar los valores a su valor final antes de agregar la animación a la capa.


Una animación básica es solo una animación visual durante el tiempo de la animación, no se modifican los valores reales. Cuando configura la animación para que no se elimine al finalizar, significa que la capa seguirá haciendo referencia al objeto de animación como una de sus animaciones. Sin embargo, ya ejecutó su animación.

El comportamiento predeterminado de cómo se ven las animaciones (su modo de relleno) es kCAFillModeRemoved lo que significa que justo después de la duración de la animación la capa se verá como si la animación nunca hubiera sucedido. Al cambiar el modo de relleno a kCAFillModeForwards o kCAFillModeBoth, puede hacer que la capa parezca como si la capa permaneciera en el estado final de la animación.

Usted puede hacer lo mismo en el inicio de la animación con kCAFillModeBackwards pero sobre todo se aplica cuando se ha activado una hora de inicio de la animación.

Así que para hacer que el aspecto de animación como lo hizo en el estado final de la animación usted puede ajustar el modo de relleno a ...Forwards y no quitar la animación o cambiar los valores reales de la capa de los valores que se espera que ellos ser justo antes de agregar la animación a la vista. Esto cambiará los valores y luego se animará desde el valor anterior al nuevo.

+0

sí, 1, 'fadeOutAnimation.fillMode = kCAFillModeForwards;' 2, 'layer.opacity = 0; [layer addAnimation: fadeOutAnimation forKey: @ "opacity"]; ' ambos funcionan, ¡eso es genial! no solo responde la pregunta, sino que también explica el mecanismo detrás de ella, siento que estoy haciendo una película :) –

+0

Solo una adición: no olvide establecer fadeOutAnimation.removedOnCompletion = NO; – Borzh