2017-09-25 89 views
1

我在Swift中开发iOS应用程序,我想用360度旋转图像的运动。动画应在每轮完成后停止2秒。快速图像旋转360度

我需要在每次旋转完成后2秒延迟。我如何设置延迟?我已经完成了图像旋转算法。

func rotate360Degrees(_ duration: CFTimeInterval = 1.0, completionDelegate: CAAnimationDelegate? = nil) { 
    let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation") 
    rotateAnimation.fromValue = 0.0 
    rotateAnimation.toValue = CGFloat(M_PI * 2.0) 
    rotateAnimation.duration = duration 

    if let delegate: CAAnimationDelegate = completionDelegate { 
     rotateAnimation.delegate = delegate 

    } 
    rotateAnimation.repeatCount = Float.greatestFiniteMagnitude; 

    self.layer.add(rotateAnimation, forKey: nil) 
} 

对于延迟我已经试过这样:

let deadlineTime = DispatchTime.now() + .seconds(2) 
    DispatchQueue.main.asyncAfter(deadline: deadlineTime, execute: { 
     self.imgView.rotate360Degrees() 
    }) 

它无法正常工作。

+0

什么不起作用?你没有调用'rotate360Degrees',或者该方法不会导致旋转?或旋转工作,但旋转之间没有停顿? (我最好的猜测:最后一个,正确的答案涉及'CAKeyframeAnimation'因为你正在做的是期待延迟开始动画永远在动画内部) – Tommy

+0

旋转工作,但我需要2秒延迟在每一次旋转中该部分不工作。 – user12346

回答

0

它非常简单。只需在身体内调用你的功能,并且一旦旋转完成,在延迟2秒后调用相同的功能。而当你想停止时,只要停下就移除它。示例

unowned let unownedSelf = self 

let deadlineTime = DispatchTime.now() + .seconds(2) 
DispatchQueue.main.asyncAfter(deadline: deadlineTime, execute: { 
unownedSelf.functionToCall() 
}) 
+0

我试图像这样让deadlineTime = DispatchTime.now()+ .seconds(2) DispatchQueue.main.asyncAfter(截止时间:deadlineTime,执行:{ VAR的AffineTransform = CGAffineTransform(rotationAngle:0.0) 的AffineTransform = affineTransform.rotated (by:CGFloat(M_PI)) let circlePath = UIBezierPath(arcCenter:CGPoint(x:100-(100/2),y:100-(100/2)),radius:CGFloat(100),startAngle:CGFloat 0),endAngle:CGFloat(M_PI * 2),顺时针:true)orbit.rotationMode = kCAAnimationRotateAuto }) 但它不起作用 – user12346

+0

问题是你需要在完成旋转后调用函数,例如它需要30秒以完成旋转,而不是在32秒后调用它。确保当你第一次调用这个函数时,你是否给它足够的时间在下一个周期开始之前暂停。现在更多的管理事情..你几乎在那里。否则,请让我知道我可以更新我的代码以获得更多理解。 – cole

+0

我已经完成了它,但是当我再次用你提供给我的一段代码调用这个函数时。动画看起来并不平坦,这很麻烦。 – user12346