2012-10-15 47 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