2012-04-14 5 views
5

Verwenden von Obj.-c für iPhone 5.1 in Xcode 4.3.2; Ich erstelle ein Array von CALayern, alle vom selben Bild. Ich möchte dann eine CABasicAnimation auf jeden CALayer im Array gleichzeitig durch Gruppierung über CATransactions anwenden. Das alles funktioniert einmal. Ich möchte jedoch wiederholt den Block von CABasicAnimations aufrufen, der in CATransactions enthalten ist, aber in der Lage sein, die Eigenschaften jeder Animation einzeln zu ändern, wenn der Block gleichzeitig ausgeführt wird. Zum Beispiel habe ich von und zu Werte für die Animation, die ich jedes Mal zufällig für die Animation auf jeder Ebene ändern möchte. Weil ich die gleiche Grundanimation wiederholen möchte, aber Eigenschaftsmodifikation mache; Die repeatCount -Eigenschaft der Animation auf einen hohen Wert zu setzen funktioniert nicht.Ich habe versucht, die animate-Methode wiederholt mit einer for-Schleife innerhalb der makeSwarm-Methode aufzurufen, animationDidStop zu verwenden, um einen weiteren Aufruf der animate-Methode auszulösen, aber was passiert, ist ein neuer Aufruf mit dem CATransaction-Block und nicht am Ende gemacht, und auch die Methode selbst aufrufen (put [self animate]; am Ende der animate-Methode); und nichts davon funktioniert. Hier ist der Grundcode. Ich nehme an, das ist einfach, aber ich sehe nichts Wichtiges. Danke, SethWie mehrere CABasicAnimations, die in einem CATransaction-Block enthalten sind, zu loopen?

die 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 

die 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

Ich glaube, ich habe das für mich selbst beantwortet. Ich setze den Delegaten für die Animation am Ende der Schleife (wenn i == 2) und wenn diese Animation endet (was anzeigt, dass die Schleife vorbei ist), rufe ich dann die Methode animationDidStop erneut auf. Wenn es eine elegantere oder problemlosere Lösung als diese gibt, bin ich ganz Ohr und werde es als Antwort akzeptieren. –

Antwort

2

Ich glaube, ich dies für mich selbst beantwortet haben. Ich setze den Delegaten für die Animation am Ende der Schleife (wenn i == 2) und wenn diese Animation endet (was anzeigt, dass die Schleife vorbei ist), rufe ich dann die Methode animationDidStop erneut auf. Wenn es eine elegantere oder problemlosere Lösung als diese gibt, bin ich ganz Ohr und werde es als Antwort akzeptieren.

+0

Falls jemand den Code für das, was ich oben erwähnt habe, benötigt, füge folgendes ein: animat.duration = 2; if (i == 0) animat.delegate = selbst; in die animierte Methode und füge diese dann als eine andere Methode hinzu - (void) animationDidStop: (CAAnimation *) theAnimation beendet: (BOOL) flag {[self animate];} –

+0

Wird der Stack schließlich mit Methodenaufrufen von Animationen gefüllt? –

Verwandte Themen