2012-04-14 7 views
5

Xcode 4.3.2でObj.-cをiPhone 5.1用に使用する。私は同じイメージからすべてのCALayersの配列を作成します。次に、CATransactionsを介してグループ化することで、配列の各CALayerにCABasicAnimationを同時に適用したいと考えています。これはすべて一度しか動作しません。しかし、私はCATransactionsに含まれるCABasicAnimationsのブロックを繰り返し呼び出すが、ブロックが同時に実行されるたびに個々のアニメーションのプロパティを個別に変更できるようにしたい。たとえば、アニメーションの開始点と終了点を、各層のアニメーションごとにランダムに変更したい場合があります。同じ基本的なアニメーションを繰り返すが、プロパティの変更をしたいからです。アニメーションメソッドのrepeatCountプロパティを何か高い値に設定すると動作しません。アニメーションメソッドの呼び出しをmakeSwarmメソッド内のforループを使用して繰り返し試みました。アニメーションメソッドの別の呼び出しを誘発するためにanimationDidStopを使用しましたが、最後にCATransactionブロックで作成され、メソッド呼び出し自体も持ちます(アニメーションメソッドの最後に[self animate]を入れます)。これのどれも動作しません。ここに基本コードがあります。これは簡単だと思いますが、私は何か重要なことは見ていません。おかげで、セスCATransactionブロックに含まれるいくつかのCABasicAnimationsをループする方法はありますか?

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

私は自分自身でこれに答えていると思います。ループの終わり(i == 2のとき)にアニメーションのデリゲートを設定し、アニメーションが終了すると(ループが終了したことを示す)、animationDidStopメソッドから再びアニメーションを呼び出します。これよりもエレガントで問題のない解決策があれば、私はすべての耳であり、それを答えとして受け入れます。 –

答えて

2

私は、私は自分自身のためにこれを答えていると信じています。ループの終わり(i == 2のとき)にアニメーションのデリゲートを設定し、アニメーションが終了すると(ループが終了したことを示す)、animationDidStopメソッドから再びアニメーションを呼び出します。これよりもエレガントで問題のない解決策があれば、私はすべての耳であり、それを答えとして受け入れます。

+0

誰かが上記のコードを必要とする場合は、これを挿入してください:animat.duration = 2; if(i == 0) animat.delegate = self; (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag {[self animate];} –

+0

アニメーションのメソッド呼び出しでスタックがいっぱいになるのですか? –

関連する問題