1

ボタンを押したままにすると画面全体に表示されるUIImageViewがあります。ボタンを押すとUIImageViewのUIImageが変更され、ボタンを離すと元のUIImageに変更します。画像が元に戻ると、画像が開始された場所にスナップバックします。

このタイマーは、ボタンが押されたときに呼び出されます。

//This is the image that changes when the button is pressed.
imView.image = image2;
runTimer = [NSTimer scheduledTimerWithTimeInterval:0.04
                                            target:self
                                          selector:@selector(perform)
                                          userInfo:nil
                                           repeats:YES];

これは、ボタンの保持が停止したときに呼び出されます。

- (IBAction)stopPerform:(id)sender{
   [runTimer invalidate];

   //THIS IS WHAT SNAPS THE ANIMATION BACK:
   //Without this the animation does not snap back
   imView.image = image1;
}

- (void)performRight{

 CGPoint point0 = imView.layer.position;
 CGPoint point1 = { point0.x + 4, point0.y };

 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position.x"];
 anim.fromValue    = @(point0.x);
 anim.toValue  = @(point1.x);
 anim.duration   = 0.2f;
 anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];

 // First we update the model layer's property.
 imView.layer.position = point1;

 // Now we attach the animation.
 [imView.layer  addAnimation:anim forKey:@"position.x"];
}

画像の変更をアニメーションに追加する必要がありますか?もしそうなら、どのように?私は本当に混乱しています。

4

1 に答える 1

0

Core Animationは、さまざまなプロパティのセットを使用してオブジェクトを表します。

Core Animationプログラミングガイドから:


モデルレイヤーツリー(または単に「レイヤーツリー」)は、アプリが最も頻繁に操作するものです。このツリーのオブジェクトは、アニメーションのターゲット値を格納するモデルオブジェクトです。レイヤーのプロパティを変更するときは常に、これらのオブジェクトの1つを使用します。

プレゼンテーションツリーには、実行中のアニメーションの実行中の値が含まれています。レイヤーツリーオブジェクトにはアニメーションのターゲット値が含まれていますが、プレゼンテーションツリーのオブジェクトは、画面に表示される現在の値を反映しています。このツリーのオブジェクトは絶対に変更しないでください。代わりに、これらのオブジェクトを使用して現在のアニメーション値を読み取り、おそらくそれらの値から始まる新しいアニメーションを作成します。


したがって、プロパティをアニメーション化するときにプレゼンテーションレイヤーを変更しますが、アニメーションが終了すると、オブジェクトはモデルプロパティ値に戻ります。

これを修正するために必要なことは、[CAAnimation animationDidStop:finished:]デリゲートメソッドを使用して、最終的なプロパティ値やその他のやりたいことを設定することです。これを使用して、使用している恐ろしいコードをダンプできればNSTimer、世界のごく一部がはるかに良くなると思います。

于 2013-02-12T16:21:53.487 に答える