あなたのコードにはいくつかの問題があります。
まず、次のようにフレームの原点を取得します。
CGPoint point = CGPointMake(imView.frame.origin.x, imView.frame.origin.y);
それは実際には問題ではありませんが、単純にこれを行うことができます:
CGPoint point = imView.frame.origin;
問題は、レイヤーposition
をフレームの原点に設定していることです。ただし、デフォルトでは、位置はビューの中心を制御し、フレームの原点は左上隅です。おそらく、最初にレイヤーの位置を取得したいでしょう:
CGPoint point = imView.layer.position; // equivalent to imView.center
次に、値が必要position.x
なキー パスを使用してCGFloat
いますが、値を提供していCGPoint
ます。これが iOS 6.1 シミュレーターで問題を引き起こすようには見えませんが、常に動作すると仮定するのはおそらく悪い考えです。
第三に、アニメーションはレイヤーのプロパティを変更しないことを理解する必要があります! 通常操作する各レイヤー (技術的にはモデルレイヤーと呼ばれます) には、関連付けられたプレゼンテーションレイヤーがあります。プレゼンテーション レイヤーのプロパティは、画面に表示される内容を制御します。モデル レイヤーのプロパティを変更すると、Core Animation は通常、プレゼンテーション レイヤーに (古い値から新しい値への) アニメーションを自動的に設定します。これは暗黙のアニメーションと呼ばれます。AUIView
は、レイヤー上で暗黙的なアニメーションを抑制します。
プレゼンテーション レイヤーのアニメーションが終了して削除されると、プレゼンテーション レイヤーのプロパティはモデル レイヤーの値に戻ります。したがって、変更を永続的にするには、モデル レイヤーのプロパティを更新する必要があります。一般的には、最初にモデル レイヤーのプロパティを更新してからアニメーションを追加し、明示的なアニメーションが暗黙的なアニメーション (作成されている場合) を上書きすることをお勧めします。
たまたま、アニメートすることはできますが、貼り付けるにはレイヤーにposition.x
設定する必要があります。私はこれが動作することをテストしました:position
model
- (IBAction)perform:(id)sender {
CGPoint point0 = imView.layer.position;
CGPoint point1 = { point0.x + 50, point0.y };
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position.x"];
anim.fromValue = @(point0.x);
anim.toValue = @(point1.x);
anim.duration = 1.5f;
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"];
}
(私が my method と呼んだことに注意してくださいperform:
。元の投稿のメソッドのスペルが間違っているようです。)
Core Animation を本当に理解したい場合は、WWDC 2011 のCore Animation Essentials ビデオを見ることを強くお勧めします。これは 1 時間の長さで、有益な情報がたくさん含まれています。