CABasicAnimation Position.Y

dav*_*ara 1 iphone objective-c

我只想用这个函数为我的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"];
Run Code Online (Sandbox Code Playgroud)

然后我想在那个时候使用该函数为它设置动画:

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"];
Run Code Online (Sandbox Code Playgroud)

但这不能正常工作,我的UIButton走向了奇怪的位置......

Dav*_*ist 14

您面临的问题是位置与原点不同.

无论如何,你正在做一个位置的相对动画,所以如果你跳过toValueand fromValue而改为使用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"];
Run Code Online (Sandbox Code Playgroud)

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"];
Run Code Online (Sandbox Code Playgroud)