1

コアアニメ使うたびに困っちゃう!誰かがこのバグで私を助けることができますか? それは私を何時間も忙しくさせてきました。

レイヤーの境界と位置をアニメーション化しています。プレゼンテーション レイヤーだけでなく、モデル レイヤーを実際に変更するには、アニメーションを開始する前に位置を設定し、最終的なtoValuesにバインドする必要があることを学びました。

私のコードは新しいオブジェクトを作成し、その位置をAからBCALayerに 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 秒で移動します。私の質問は次のとおりです。私のコードまたは私のアプローチの何が問題なのですか?

4

1 に答える 1