2012-04-14 12 views
5

Utilizzo di Obj.-c per iPhone 5.1 in Xcode 4.3.2; Creo una serie di CALayer, tutti dalla stessa immagine. Quindi desidero applicare una CABasicAnimation a ciascun CALayer nell'array contemporaneamente raggruppando tramite CATransactions. Tutto funziona una volta. Tuttavia, mi piacerebbe chiamare ripetutamente il blocco di CABasicAnimations contenute in CATransactions, ma essere in grado di modificare le proprietà di ciascuna animazione singolarmente ogni volta che il blocco viene eseguito simultaneamente. Per esempio, ho da e verso i valori per l'animazione che vorrei cambiare casualmente ogni volta per l'animazione su ogni livello. Perché vorrei ripetere la stessa animazione di base, ma apportare modifiche alle proprietà; l'impostazione della proprietà repeatCount dell'animazione su un valore elevato non funzionerà. Ho provato a chiamare ripetutamente il metodo animate utilizzando un ciclo for all'interno del metodo makeSwarm, utilizzando animationDidStop per indurre un altro call del metodo animato ma quello che succede è una nuova chiamata fatto con il blocco CATransaction e non alla fine, e avere anche il metodo call stesso (put [auto animate]; alla fine del metodo animato); e niente di tutto ciò funziona. Ecco il codice di base. Presumo che questo sia semplice, ma non vedo qualcosa di importante. Grazie, Sethcome eseguire il loop di più CABasicAnimations contenute in un blocco CATransaction?

il 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 

il 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

Credo di aver risposto per conto mio. Ho impostato il delegato per l'animazione alla fine del ciclo (quando ho == 2) e al termine dell'animazione (che indica che il ciclo è finito), quindi dal metodo animationDidStop, richiamo di nuovo il metodo animate. Se c'è una soluzione più elegante o senza problemi di questo, sono tutte orecchie e la accetterò come risposta. –

risposta

2

credo di aver risposto a questa per me stesso. Ho impostato il delegato per l'animazione alla fine del ciclo (quando ho == 2) e al termine dell'animazione (che indica che il ciclo è finito), quindi dal metodo animationDidStop, richiamo di nuovo il metodo animate. Se c'è una soluzione più elegante o senza problemi di questo, sono tutte orecchie e la accetterò come risposta.

+0

Nel caso in cui qualcuno abbia bisogno del codice per quello che ho dichiarato sopra, inserisci questo: animat.duration = 2; if (i == 0) animat.delegate = self; nel metodo animato e quindi aggiungere questo come un altro metodo - (void) animationDidStop: (CAAnimation *) theAnimation finished: (BOOL) flag {[self animate];} –

+0

Alla fine lo stack si riempirà di chiamate al metodo di animazioni? –

Problemi correlati