2012-04-14 14 views
5

Xcode 4.3.2'de iPhone 5.1 için Obj.-c'nin kullanılması; Aynı görüntüden bir dizi CALayer oluşturuyorum. Daha sonra, dizideki her CALayer'e aynı anda CATransactions yoluyla gruplama yaparak bir CABasicAnimation uygulamak istiyorum. Her şey bir kez çalışır. Bununla birlikte, CATransactions içinde yer alan CABasicAnimations bloğunu tekrar tekrar aramak istiyorum, ancak her bir bloğun özelliklerini aynı anda her blok yürütüldüğünde ayrı ayrı değiştirebiliyorum. Örneğin, her katmandaki animasyon için her seferinde rastgele değiştirmek istediğim animasyona ait değerlerim var. Çünkü aynı temel animasyonu tekrarlamak, ancak özellik değiştirmeyi yapmak istiyorum; Animasyonun repeatCount özelliğini bazı yüksek değerlere ayarlamak işe yaramaz.Japon yöntemini kullanarak bir for döngüsünü kullanarak tekrar tekrar canlandırma yöntemini çağırmayı denedim, animasyon yönteminin başka bir çağrım çağrısı yapmak için animationDidStop kullanarak ancak yeni bir çağrı olduğunu Sonunda CATransaction bloğu ile yapılmış, ve aynı zamanda yöntemin kendisini çağırmak (animate yönteminin sonunda [kendini canlandırma] koymak;); ve bu çalışmaların hiçbiri. İşte temel kod. Bunun basit olduğunu düşünüyorum ama önemli bir şey görmüyorum. Teşekkürler, SethCATransaction bloğunda bulunan birkaç CABasicAnimations nasıl döngülenir?

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 

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

Bunu kendim için cevapladığımı düşünüyorum. Döngü sonunda animasyonun temsilcisini (i == 2 olduğunda) ve bu animasyon bittiğinde (belirten döngü sona erdi) animDidStop yönteminden sonra yöntemi tekrar canlandırın. Bundan daha zarif veya sorunsuz bir çözüm varsa, ben hepim kulaklarım ve cevabı kabul eder. –

cevap

2

Ben kendim için bu cevap inanıyoruz. Döngü sonunda animasyonun temsilcisini (i == 2 olduğunda) ve bu animasyon bittiğinde (belirten döngü sona erdi) animDidStop yönteminden sonra yöntemi tekrar canlandırın. Bundan daha zarif veya sorunsuz bir çözüm varsa, ben hepim kulaklarım ve cevabı kabul eder.

+0

Herhangi birinin yukarıda belirttiğim kodlara ihtiyacı varsa, şunu ekleyin: animat.duration = 2; (I == 0) animat.delegate = self; canlandırma yöntemine ekleyin ve bunu başka bir yöntem olarak ekleyin - (void) animationDidStop: (CAAnimation *)Animation tamamlandı: (BOOL) bayrağı {[self animate];} –

+0

Yığın sonunda animasyonlar yöntem çağrıları ile dolduracak mı? –

İlgili konular