/ /コアアニメーション、2番目のアニメーションでコードが失敗する-iOS-ios、コアアニメーション、calayer、caanimation

Core Animation、私のコードは、2番目のアニメーション、iOS、コアアニメーション、calayer、アニメーション

私が使うたびに コアアニメーション 困る!誰かがこのバグを手伝ってくれる?それは私を何時間も忙しくさせてきました。

レイヤーの境界と位置をアニメーション化しています。本当に変えるには モデル層、だけでなく プレゼンテーション層、私は人が位置を設定し、彼らの決勝戦にバインドする必要があることを学びました toValues アニメーションを開始する前に。

私のコードは新しい CALayer-オブジェクト、そしてそれはからその位置をアニメーション化します AB 1秒間。 これはうまくいきます!

後で、同じコードスニペットを使用して、レイヤーを元の位置(A)に戻します。これも1秒間です。これはします ない 作業!レイヤーは戻りますが、それは非常に起こります 早く の結果として 位置を割り当ててtoValuesにバインドするコード行によって引き起こされるデフォルトのアニメーション.

本当にしたいです わかる 私のコードの何が問題になっていますか? それは 打ち間違え?または私は 誤解されました コアアニメーション(再び)?

これが私のコードです。最初の方法は、新しい CALayer オブジェクトを作成し、それをスーパーレイヤーに追加します。

-(CALayer*) addLayerFromIm:(UIImage*) im{

CALayer *lay = [CALayer layer];
lay.bounds = CGRectMake(0,0, 100,100); // default values never used
lay.position = CGPointMake(0,0);
lay.contents = (id) im.CGImage;
lay.zPosition = 0;
[self.layer addSublayer:lay];
return lay;  }

次のメソッドは、アニメーションをレイヤーに追加し、その位置と境界のプロパティも変更します。

-(CALayer*) animateLayer:(CALayer*) lay fromRect:(CGRect)rcFrom toRect:(CGRect)rcTo duration:(float) duration{

[lay removeAllAnimations];

lay.position  = rcTo.origin;
lay.bounds    = CGRectMake( 0,0, rcTo.size.width,rcTo.size.height);

CABasicAnimation* animP = [CABasicAnimation animationWithKeyPath:@"position"];
animP.fromValue =[NSValue  valueWithCGPoint:rcFrom.origin];
animP.toValue =  [NSValue  valueWithCGPoint:rcTo.origin];
animP.fillMode =  kCAFillModeForwards;
animP.duration = duration;
animP.beginTime = CACurrentMediaTime();
animP.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
animP.removedOnCompletion = YES;
[lay addAnimation:animP forKey:nil];


CABasicAnimation* animB = [CABasicAnimation animationWithKeyPath:@"bounds"];
animB.fromValue = [NSValue valueWithCGRect:CGRectMake(0, 0, rcFrom.size.width, rcFrom.size.height)];
animB.toValue   = [NSValue valueWithCGRect:CGRectMake(0, 0, rcTo.size.width, rcTo.size.height)];
animB.fillMode = kCAFillModeForwards;
animB.duration = duration;
animB.beginTime = CACurrentMediaTime();
animB.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
animB.removedOnCompletion = YES;

[lay addAnimation:animB forKey:nil];

return lay; }

レイヤーの作成方法とアニメーション方法は次のとおりです(これは正常に機能します)

UIImage* imDst = [UIImage imageNamed:@"connectionDst.png"];

CALayer *lay = [self animateLayer:[self addLayerFromIm:imDst] fromRect:rcA toRect:rcB duration:1.0];

後で、レイヤーをAに戻そうとします。

[self animateLayer:lay fromRect:rcB toRect:rcA duration:1.0];

ただし、デフォルトのアニメーションが開始され、0.2秒でレイヤーが移動します。私の質問は:私のコード、または私のアプローチの何が問題になっていますか?

回答:

回答№1は0

アプローチは少し奇妙です。これは自動反転アニメーションのように見えますが、これは簡単に実装できます。 autoreverses の特性 CABasicAnimation。または、キーフレームアニメーションを試してみてください animateWithDuration: 機能on UIView.