6

私のアプリケーションでは、アニメーションに CABasicAnimation を使用しています。アニメーションの速度を動的に変更したいので、速度を変更するスライダーを 1 つ追加しました。以下は私のアニメーションコードです。しかし、速度を変更することはできません。速度の値を変更しても何も起こりません。

        CABasicAnimation * a = [CABasicAnimation animationWithKeyPath:@"position"];
    [a setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];

    CGPoint startPt = CGPointMake(self.view.bounds.size.width + displayLabel.bounds.size.width / 2,
                                  displayLabel.frame.origin.y);
    CGPoint endPt = CGPointMake(displayLabel.bounds.size.width / -2, displayLabel.frame.origin.y);

    [a setFromValue:[NSValue valueWithCGPoint:startPt]];
    [a setToValue:[NSValue valueWithCGPoint:endPt]];
    [a setAutoreverses:NO];
    [a setDuration:speeds];
    [a setRepeatCount:HUGE_VAL];
    [displayLabel.layer addAnimation:a forKey:@"rotationAnimation"];


    - (IBAction)speedSlider:(id)sender {

         speeds = slider.value;

   }
4

6 に答える 6

6

速度を変更する最良の方法は、レイヤーの時間システムを変更することだと思います

displayLabel.layer.timeOffset =
     [displayLabel.layer convertTime:CACurrentMediaTime() fromLayer:nil]; 
displayLabel.layer.beginTime = CACurrentMediaTime(); 
displayLabel.layer.speed= slider.value;

事前にご覧いただけます。https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreAnimation_guide/AdvancedAnimationTricks/AdvancedAnimationTricks.html#//apple_ref/doc/uid/TP40004514-CH8-SW2

于 2016-01-08T07:36:08.173 に答える
2

編集:ただし、さらに問題があるようです:実行中のアニメーションでそのような値を変更できるようには見えません。現在のアニメーションを削除し、値を変更して新しいアニメーションを追加する必要があります。新しいアニメーションを追加するときに不快な効果を避けるために、これには少し注意が必要な場合があります。

上記のスレッドから、アニメーションを繰り返すのではなく、デリゲート (ここを参照) を使用してアニメーションを再追加し、代わりに次のアニメーション サイクルの新しい速度を設定することで、これを実行できる場合があります。

元の投稿:

最初にアニメーションに渡した値を変更しています。これは、実行中のアニメーションには影響しません。それへの参照を取得し、アニメーション オブジェクトの期間プロパティを変更する必要があります。アクションメソッドで次のようなもの:

CABasicAnimation *a = [displayLabel.layer animationForKey:@"rotationAnimation"];
a.duration = slider.value;
于 2012-06-26T11:32:52.287 に答える
1

すでに実行されているアニメーションのプロパティを変更できないという jrturton は正しいと思います。しかし、できることは、アニメーションを短いセグメントに分割し、スライダーの値が変化したときに次のセグメントの速度を変更することです。

ポイント A からポイント D までアニメーション化する代わりに、AB、次に BC、次に CD からアニメーション化します。親クラスの animationDidStop を使用して、現在のポイントを確認し、スライダーの値を確認して、次のアニメーションを開始します。

これによりぎくしゃくした動きが発生する可能性がありますが、非常に小さなセグメントを使用すると、動きを滑らかにすることができる場合があります。

于 2012-06-27T12:04:36.077 に答える
1

アニメーションを停止し、新しい継続時間で新しいアニメーションを再開する必要があります

ただし、 fromValue と toValue をログに記録し、古い toValue を新しい fromValue として使用して、シームレスな変更を実行することを忘れないでください。

于 2013-09-12T08:27:26.777 に答える
0

必要に応じて速度を設定します。

    a.duration=0.5;

これを試して...

于 2012-06-26T11:10:25.820 に答える
0

テキストの自動スクロールだけが必要な場合は、1 つのクラスを使用することもできます

http://blog.stormyprods.com/2009/10/simple-scrolling-uilabel-for-iphone.html

あなたのケースでもうまくいくかもしれません、試してみてください。

于 2012-06-26T12:52:57.630 に答える