2017-07-21 57 views
2

我想在一个按钮上点击CABasicAnimation动画UIView对象的位置。对象动画并移动到“到”位置,但在动画结束后返回到原始位置。即使在动画结束后,我也想保留视图对象的位置。这是执行动画的代码片段。 viewObject是我试图动画的对象。iOS的动画对象回到原来的位置

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") 
+0

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

+0

请试试这个 –

+0

这解决了这个问题。但我不清楚为什么我应该设置fillMode属性。 – SarwanKumr

回答

1

添加以下行请添加以下代码:

目标C:

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

斯威夫特3:

animation.isRemovedOnCompletion = false 
animation.fillMode = kCAFillModeForwards 
0
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 
+0

这是旧的语法。在回答之前至少检查一次。 –

2

0

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

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 

}) 

试试这个。它会很好地工作

相关问题