2

LOOP内で一連のアニメーションを繰り返し、各ループでいくつかのパラメーターをランダムに変更しようとしています。これがコードです。なぜそれが機能しないのか誰か知っていますか?ボタンアクションで一度呼び出すと機能しますが、ループでは機能しません。どうもありがとう!ジュゼッペ

-(IBAction)startLoop:(id)sender {
    for (int i=1;i<10; i++) {
        [self animation2];
    }
}


-(id) animation2 {

    int max=500;
    UIImage *myImage = [UIImage imageNamed:@"coccinella2.png"];
    CALayer *myLayer = [CALayer layer];
    myLayer.contents = (id)myImage.CGImage;
    myLayer.bounds = CGRectMake(0, 0, 50, 60);
    [myLayer setPosition:CGPointMake(arc4random()%(max), arc4random()%(max))];
    [myLayer setBounds:CGRectMake(0.0, 0.0, 50.0, 60.0)];
    [self.view.layer addSublayer:myLayer];


    //translation1
    CGPoint startPt = CGPointMake(arc4random()%(max),arc4random()%(max));
    CGPoint endPt = CGPointMake(arc4random()%(max),arc4random()%(max));
    CABasicAnimation *transl1 = [CABasicAnimation animationWithKeyPath:@"position"];
    transl1.removedOnCompletion = FALSE;
    transl1.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    transl1.fromValue = [NSValue valueWithCGPoint:startPt];
    transl1.toValue = [NSValue valueWithCGPoint:endPt];
    transl1.duration = 2.0;
    transl1.fillMode = kCAFillModeForwards;
    transl1.beginTime = 0;

    //scale 1
    CABasicAnimation *scale1 = [CABasicAnimation 
                                animationWithKeyPath:@"transform.scale"];
    scale1.removedOnCompletion = FALSE;
    [scale1 setToValue:[NSNumber numberWithInt:3]];
    [scale1 setDuration:2.0f];
    scale1.fillMode = kCAFillModeForwards;
    scale1.beginTime = 0;

    //rotation1
    CABasicAnimation *rotation1 = [CABasicAnimation 
                                   animationWithKeyPath:@"transform.rotation.z"];
    rotation1.removedOnCompletion = FALSE;
    [rotation1 setFromValue:DegreesToNumber(0)];
    [rotation1 setToValue:DegreesToNumber(90)];
    //rotation1.repeatCount = HUGE_VALF;
    [rotation1 setDuration:2.0f];
    rotation1.fillMode = kCAFillModeForwards;
    rotation1.beginTime = 0;

    //group
    CAAnimationGroup* group = [CAAnimationGroup animation];
    [group setDuration: 6.0];
    group.removedOnCompletion = FALSE;
    group.fillMode = kCAFillModeForwards;
    [group setAnimations: [NSArray arrayWithObjects:scale1, transl1, rotation1, nil]];
    [myLayer addAnimation: group forKey:  nil];
}
4

2 に答える 2

2

コードは注釈を10回繰り返さないが、すぐに10個のアニメーションを開始します。前のアニメーションが終了した後にアニメーションを開始することが目標である場合は、を使用してみてくださいNSTimer

于 2012-05-07T09:59:50.833 に答える
1

NSTimerを使用して、アニメーションの各グループを異なる時間にトリガーするか、次のようなコードで各グループにbeginTimeを設定できます。

group.beginTime = CACurrentMediaTime() + delay;

アニメーションの場合、CAは別のスレッドで実行され、アプリがビジーになってもNSTimersのように停止しないため、beginTimeを使用するとより正確なタイミングが得られます。

于 2012-05-08T00:10:24.520 に答える