2012-04-14 11 views
5

Usando Obj.-c para iPhone 5.1 en Xcode 4.3.2; Creé una matriz de CALayers, todos de la misma imagen. Luego deseo aplicar una CABasicAnimation a cada CALayer en la matriz simultáneamente mediante la agrupación a través de CATransactions. Todo esto funciona una vez. Sin embargo, me gustaría llamar repetidamente al bloque de CABasicAnimations que están contenidas en CATransactions pero ser capaz de modificar las propiedades de cada animación individualmente cada vez que el bloque se ejecuta simultáneamente. Por ejemplo, tengo desde y hacia valores para la animación que me gustaría cambiar aleatoriamente cada vez para la animación en cada capa. Porque me gustaría repetir la misma animación básica, pero modificar la propiedad; establecer la propiedad repeatCount de la animación a un valor alto no funcionará. He intentado llamar al método animado repetidamente usando un ciclo for en el método makeSwarm, usando animationDidStop para inducir otra llamada de método animado pero lo que termina sucediendo es una nueva llamada hecho con el bloque CATransaction y no al final, y también tiene la llamada al método en sí (put [self animar]; al final del método animado); y nada de esto funciona Aquí está el código básico. Supongo que esto es sencillo, pero no veo algo importante. Gracias, Sethcómo recorrer varias CABasicAnimations contenidas en un bloque de CATransaction?

la ViewController.h

#import <QuartzCore/QuartzCore.h> 
#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController{ 
    UIImage *beeImage; 

    UIImageView *beeView; 
    CALayer *beeLayer; 
    CABasicAnimation *animat; 
    NSMutableArray *beeArray; 
    NSMutableArray *beeanimArray; 

} 

@property(retain,nonatomic) UIImage *beeImage; 
@property(retain,nonatomic) NSMutableArray *beeArray; 
@property(retain,nonatomic) NSMutableArray *beeanimArray; 
@property(retain,nonatomic) UIImageView *beeView; 
@property(retain,nonatomic) CALayer *beeLayer; 
@property(retain,nonatomic)CABasicAnimation *animat; 
-(void) animate; 
-(void) makeSwarm; 


@end 

la ViewController.m

-(void) makeSwarm{ 

    self.view.layer.backgroundColor = [UIColor orangeColor].CGColor; 
    self.view.layer.cornerRadius = 20.0; 
    self.view.layer.frame = CGRectInset(self.view.layer.frame, 20, 20); 

    CGRect beeFrame; 
    beeArray = [[NSMutableArray alloc] init]; 
    beeImage = [UIImage imageNamed:@"bee50x55px.png"]; 
    beeFrame = CGRectMake(0, 0, beeImage.size.width, beeImage.size.height); 


    int i; 

    CALayer *p = [[CALayer alloc] init]; 


    for (i = 0; i < 3; i++) { 



     beeView = [[UIImageView alloc] initWithFrame:beeFrame]; 
     beeView.image = beeImage;  
     beeLayer = [beeView layer]; 
     [beeArray addObject: beeLayer]; 


     p = [beeArray objectAtIndex: i];  

     [p setPosition:CGPointMake(arc4random()%320, arc4random()%480)]; 
     [self.view.layer addSublayer:p]; 



    } 



    [self animate]; 

} 

-(void)animate 
{ 
    //the code from here to the end of this method is what I would like to repeat as many times as I would like 
    [CATransaction begin]; 

    int i; 
    for (i = 0; i < 3; i++) { 

     animat = [[CABasicAnimation alloc] init]; 
     [animat setFromValue:[NSValue valueWithCGPoint:CGPointMake(arc4random()%320, arc4random()%480)]]; 
     animat.toValue = [NSValue valueWithCGPoint:CGPointMake(arc4random()%320, arc4random()%480)]; 
     [animat setFillMode:kCAFillModeForwards]; 
     [animat setRemovedOnCompletion:NO]; 
     animat.duration=1.0; 


     CALayer *p = [[CALayer alloc] init]; 
     p = [beeArray objectAtIndex: i]; 
     [p addAnimation:animat forKey:@"position"]; 



    }  

    [CATransaction commit];  


} 
+0

Creo que he respondido esto por mí mismo. Configuro el delegado para la animación al final del ciclo (cuando i == 2) y cuando esa animación finaliza (indicando que el ciclo ha terminado), luego del método animationDidStop, entonces llamo al método animar de nuevo. Si hay una solución más elegante o libre de problemas que esta, soy todo oídos y la aceptaré como la respuesta. –

Respuesta

2

Creo haber respondido esto por mí mismo. Configuro el delegado para la animación al final del ciclo (cuando i == 2) y cuando esa animación finaliza (indicando que el ciclo ha terminado), luego del método animationDidStop, entonces llamo al método animar de nuevo. Si hay una solución más elegante o libre de problemas que esta, soy todo oídos y la aceptaré como la respuesta.

+0

En caso de que alguien necesite el código para lo que dije anteriormente, inserte esto: animat.duration = 2; if (i == 0) animat.delegate = self; en el método animado y luego agregue esto como otro método - (void) animationDidStop: (CAAnimation *) theAnimation finished: (BOOL) flag {[self animation];} –

+0

¿La pila eventualmente se llenará con llamadas a métodos de animaciones? –

Cuestiones relacionadas