5

Xcode 4.3.2 で iPhone 5.1 に Obj.-c を使用する。すべて同じ画像から CALayers の配列を作成します。次に、CATransactions を介してグループ化することにより、配列内の各 CALayer に CABasicAnimation を同時に適用したいと考えています。これはすべて一度に機能します。ただし、CATransactions に含まれる CABasicAnimations のブロックを繰り返し呼び出したいのですが、ブロックが同時に実行されるたびに各アニメーションのプロパティを個別に変更できるようにしたいと考えています。たとえば、各レイヤーのアニメーションのたびにランダムに変更したいアニメーションの from 値と to 値があります。同じ基本的なアニメーションを繰り返したいのですが、プロパティを変更します。アニメーションの repeatCount プロパティを高い値に設定しても機能しません。makeSwarm メソッド内で for ループを使用して animate メソッドを繰り返し呼び出してみましたが、animateDidStop を使用して animate メソッドの別の呼び出しを誘導しましたが、最終的には最後ではなく CATransaction ブロックで新しい呼び出しが行われ、またメソッド呼び出し自体 (animate メソッドの最後に [self animate]; を置く); そして、これはどれも機能しません。これが基本的なコードです。これは簡単だと思いますが、重要なことはわかりません。ありがとう、セス しかし、私は何か重要なものを見ていません。ありがとう、セス しかし、私は何か重要なものを見ていません。ありがとう、セス

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];     


}
4

1 に答える 1

2

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

于 2012-04-16T19:55:05.200 に答える