2012-10-15 45 views
1

我只是想我的動畫中的UIButton使用此功能的位置:CABasicAnimation Position.Y

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去奇怪的位置...

回答

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 
       }]; 
+2

如果您只是_moving_視圖,爲什麼不動畫的'中心'而不是? –

+0

絕對完美!但動畫結束時是否存在回調方法? – davidOhara

+1

是的,你填寫完成塊。 Ive更新了答案 – jackslash

10

你面臨的問題是,位置是不一樣的原點。

無論如何,你正在做的位置的相對動畫所以,如果你跳過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"]; 
+1

我發現這個答案比接受更有用,特別是使用'byValue',而不是'fromValue'和'toValue'。 – sconewolf