我设置了CADisplayLink
,调用以下drawCircle()
函数在10秒内绘制圆路径动画:
func drawCircle() {
currentDuration = currentDuration + displayLink.duration
circleLayer.strokeEnd = min(CGFloat(currentDuration/maxDuration), 1)
if (currentDuration >= maxDuration) {
stopCircleAnimation()
}
}
func stopCircleAnimation() {
let pausedTime = circleLayer.convertTime(CACurrentMediaTime(), fromLayer: nil)
circleLayer.speed = 0
circleLayer.timeOffset = pausedTime
}
其中currentDuration
是已用时间,maxDuration
等于10.除currentDuration >= maxDuration
外,此方法正常。即使strokeEnd设置为1,它也永远不会完全完成圆圈。这是为什么?
修改
我认为它可能与speed
的{{1}}属性有关。如果我将其设置为更高的金额,例如10,然后圆圈完全关闭。
答案 0 :(得分:0)
找到答案 - 在设置strokeEnd属性时禁用动画:
CATransaction.begin()
CATransaction.setDisableActions(true)
circleLayer.strokeEnd = min(CGFloat(currentDuration/maxDuration), 1)
CATransaction.commit()
答案 1 :(得分:0)
这是因为设置strokeEnd
的{{1}}会为新值生成隐式动画。然后在此动画完成之前将图层的速度设置为零,因此暂停'动画,看起来不完整'。
虽然你可以通过CAShapeLayer
禁用隐式动画来解决这个问题 - 你应该考虑在这里使用setDisableActions
是否合适。 Core Animation旨在通过生成自己的中间步骤来为您生成和运行动画,那么为什么不通过图层CADisplayLink
的显式或隐式动画来实现相同的结果?
以下是一个如何使用隐式动画执行此操作的示例:
strokeEnd
或者如果你想将它作为一个明确的动画:
CATransaction.begin()
CATransaction.setAnimationDuration(10)
// if you really want a linear timing function – generally makes the animation look ugly
CATransaction.setAnimationTimingFunction(CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear))
circleLayer.strokeEnd = 1
CATransaction.commit()