我有一个开始/停止按钮和一个我要旋转的图像视图。
当我按下按钮时,我希望开始旋转,当我再次按下按钮时,图像应该停止旋转。我目前正在使用getResponseHeaders()
动画,但我还没有找到一种方法来停止观看动画。
我希望图像旋转,但是当动画停止时,图像不应该返回到起始位置,而是继续动画。
UIView
这是我的代码,但它并不像我那样工作。
答案 0 :(得分:9)
Swift 3.x
开始动画
let rotationAnimation : CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
rotationAnimation.toValue = NSNumber(value: .pi * 2.0)
rotationAnimation.duration = 0.5;
rotationAnimation.isCumulative = true;
rotationAnimation.repeatCount = .infinity;
self.imageWood?.layer.add(rotationAnimation, forKey: "rotationAnimation")
停止动画
self.imageWood?.layer.removeAnimation(forKey: "rotationAnimation")
Swift 2.x
开始动画
let rotationAnimation : CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
rotationAnimation.toValue = NSNumber(double: M_PI * 2.0)
rotationAnimation.duration = 1;
rotationAnimation.cumulative = true;
rotationAnimation.repeatCount = .infinity;
self.imageWood?.layer.addAnimation(rotationAnimation, forKey: "rotationAnimation")
停止动画
self.imageWood?.layer.removeAnimation(forKey: "rotationAnimation")
答案 1 :(得分:2)
使用现有代码,您可以通过以下方式实现
var isTapped = true
@IBAction func startStopButtonTapped(_ sender: Any) {
ruotate()
isTapped = !isTapped
}
func ruotate() {
if isTapped {
let rotationAnimation : CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
rotationAnimation.toValue = NSNumber(value: Double.pi * 2.0)
rotationAnimation.duration = 1;
rotationAnimation.isCumulative = true;
rotationAnimation.repeatCount = HUGE;
self.imageWood?.layer.add(rotationAnimation, forKey: "rotationAnimation")
}else{
self.imageWood?.layer.removeAnimation(forKey: "rotationAnimation")
}
}
答案 2 :(得分:2)
如果使用UIView
动画,操作系统仍会创建一个或多个CAAnimation
个对象。因此,要停止UIView动画,您仍然可以使用:
myView.layer.removeAllAnimations()
或者,如果您在图层上使用CAAnimation创建动画:
myLayer.removeAllAnimations()
在任何一种情况下,您都可以捕获动画的当前状态,并在删除动画之前将其设置为最终状态。如果您正在对视图的转换进行动画处理,就像在这个问题中那样,那段代码可能如下所示:
func stopAnimationForView(_ myView: UIView) {
//Get the current transform from the layer's presentation layer
//(The presentation layer has the state of the "in flight" animation)
let transform = myView.layer.presentationLayer.transform
//Set the layer's transform to the current state of the transform
//from the "in-flight" animation
myView.layer.transform = transform
//Now remove the animation
//and the view's layer will keep the current rotation
myView.layer.removeAllAnimations()
}
如果您要为变换以外的属性设置动画,则需要更改上面的代码。
答案 3 :(得分:1)
您的代码使图像旋转2PI角度,但如果您在旋转未结束时单击按钮,动画将在停止前完成,这就是它到达初始位置的原因。
你应该使用CABasicAnimation来使用你可以在任何时候停止保持最后位置的轮换。
答案 4 :(得分:1)
Apple在iOS 10中添加了一个新类UIViewPropertyAnimator
。UIViewPropertyAnimator
可让您轻松创建基于UIView的动画,可以暂停,反转和来回擦除。
如果您重构代码以使用A UIViewPropertyAnimator
,您应该可以暂停和恢复动画。
我有sample project on Github演示使用UIViewPropertyAnimator
。我建议看一下。