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