iOS 动画对象回到原来的位置

iOS animating object goes back to original position

我正在尝试在点击按钮时使用 CABasicAnimation 为 UIView 对象的位置设置动画。对象动画并移动到 'to' 位置,但在动画结束后 returns 回到原始位置。即使在动画结束后,我也想保留视图对象的位置。这是执行动画的代码片段。 viewObject 是我要设置动画的对象。

let animation = CABasicAnimation(keyPath: "position")
animation.timingFunction = CAMediaTimingFunction(controlPoints: 0.86, 0, 0.07, 1.0)
animation.duration = 0.5
animation.fromValue = NSValue(cgPoint: CGPoint(x: viewObject.center.x, y: viewObject.center.y))
animation.toValue = NSValue(cgPoint: CGPoint(x: viewObject.center.x + 64, y: viewObject.center.y))
viewObject.layer.add(animation, forKey: "position")
UIView.animateWithDuration(0.7, delay: 1.0, options: .CurveEaseOut, animations:
{
    Code
}, completion: 
{ 
   finished in
   println("Nothing to do!")
})

只需在一个块内和完成时制作动画。保持那个姿势,不要后退。它应该保持在相同的位置

并在代码中添加这一行 cabasicanimation.removedOnCompletion = false; 这条线会让它不回到原来的状态

在添加动画之前添加以下行

animation.isRemovedOnCompletion = false
animation.fillMode = kCAFillModeForwards

Swift

animation.fillMode = .forwards
animation.isRemovedOnCompletion = false

请添加以下代码:

Objective-C:

animation.fillMode = kCAFillModeForwards;
animation.removedOnCompletion = NO;

Swift 4:

animation.fillMode = .forwards
animation.isRemovedOnCompletion = false

我认为你需要在完成时再次给出框架。所以,这可能是一个不错的方法

UIView.animate(withDuration: 0.7, delay: 1.0, options: .curveLinear, animations: {

   let animation = CABasicAnimation(keyPath: "position")
    animation.timingFunction = CAMediaTimingFunction(controlPoints: 0.86, 0, 0.07, 1.0)
    animation.duration = 0.5
    animation.fromValue = NSValue(cgPoint: CGPoint(x: self.viewObject.center.x, y: self.viewObject.center.y))
    animation.toValue = NSValue(cgPoint: CGPoint(x: self.viewObject.center.x + 64, y: self.viewObject.center.y))
    self.viewObject.layer.add(animation, forKey: "position")

}, completion: { finished in
    self.viewObject.frame.origin.x = self.viewObject.frame.origin.x + 64

})

试试这个。它将完美运行

如果你想保住你的位置,你应该把你的代码和我的结构一样

CATransaction.begin()
CATransaction.setDisableActions(true)
CATransaction.setCompletionBlock {
   // Input code set new position at here
}
// Intput code animation
CATransaction.commit()