1

この関数を使用してUIButtonの位置をアニメーション化したいだけです。

CABasicAnimation *moveUp;
    moveUp          = [CABasicAnimation animationWithKeyPath:@"position.y"];
    moveUp.fromValue = [NSNumber numberWithFloat:self.retestBTN.frame.origin.y];
    moveUp.toValue  = [NSNumber numberWithFloat:self.retestBTN.frame.origin.y - 50];
    moveUp.duration = 1.0;
    moveUp.removedOnCompletion = NO;
    moveUp.fillMode = kCAFillModeBoth;
    moveUp.delegate = self;
    [[retestBTN layer] addAnimation:moveUp forKey:@"y"];

そして、その機能を使って、後でアニメーション化したいと思います。

CABasicAnimation *moveDown;
moveDown            = [CABasicAnimation animationWithKeyPath:@"position.y"];
moveDown.fromValue  = [NSNumber numberWithFloat:self.retestBTN.frame.origin.y];
moveDown.toValue    = [NSNumber numberWithFloat:self.retestBTN.frame.origin.y + 50];
moveDown.duration   = 1.0;
moveDown.removedOnCompletion = NO;
moveDown.fillMode   = kCAFillModeForwards;
[[retestBTN layer] addAnimation:moveDown forKey:@"y"];

しかし、これは正しく機能しません、私のUIButtonは奇妙な位置に行きます...

4

2 に答える 2

17

あなたが直面している問題は、位置が原点と同じではないということです。

とにかく、あなたは位置の相対的なアニメーションをしているので、をスキップして代わりにプロパティを使用する方が簡単ですtoValuefromValue相対byValue的な変更を伴う)。コードは次のようになります。

CABasicAnimation *moveUp;
moveUp          = [CABasicAnimation animationWithKeyPath:@"position.y"];      
moveUp.byValue  = @(-50.0f); // or [NSNumber numberWithFloat:-50.0f] if you really need to
moveUp.duration = 1.0;
moveUp.removedOnCompletion = NO;
moveUp.fillMode = kCAFillModeBoth;
moveUp.delegate = self;
[[retestBTN layer] addAnimation:moveUp forKey:@"y"];

CABasicAnimation *moveDown;
moveDown            = [CABasicAnimation animationWithKeyPath:@"position.y"];
moveDown.byValue    = @(50.0f); // or [NSNumber numberWithFloat:50.0f] if you really need to
moveDown.duration   = 1.0;
moveDown.removedOnCompletion = NO;
moveDown.fillMode   = kCAFillModeForwards;
[[retestBTN layer] addAnimation:moveDown forKey:@"y"];
于 2012-10-23T13:48:59.900 に答える
3

CAAnimationを使用すると、レイヤーをアニメーション化するだけになります。またmodelLayer、オブジェクトのを実際に変更することはありません。アニメーションを作成するだけで、レイヤーのプロパティをpresentationLayer実際に変更することはありません。positionこれは、ボタンが実際に移動することはなく、画面上に描画された場所が移動することを意味します。

ボタンがUIButtonの場合でも、レイヤーがどこにあるかではなく、ビューがどこにあるかをタッチします。次のようにUIKitを使用すると、任意のビューをはるかに簡単にアニメーション化できます。

[UIView animateWithDuration:1.0
                      delay:0.0
                    options:UIViewAnimationOptionCurveEaseInOut
                 animations:^{
                     CGRect frame = self.retestBTN.frame;
                     frame.origin.y -= 50;
                     self.retestBTN.frame = frame;
                 }
                 completion:^(BOOL finished){
                     //callback code goes here
                 }];
于 2012-10-23T13:50:37.903 に答える