gpt4 book ai didi

swift - 使用 CADisplayLink 动画的 CAShapeLayer 描边未完成

转载 作者:行者123 更新时间:2023-11-28 06:43:38 25 4
gpt4 key购买 nike

我已经设置了一个 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,它也永远不会完全完成圆。这是为什么??

编辑

我认为这可能与 circleLayerspeed 属性有关。如果我将它设置为更高的数量,例如10,则圆圈完全闭合。

最佳答案

这是因为设置 CAShapeLayerstrokeEnd 会为新值生成隐式动画。然后,在此动画完成之前将层的速度设置为零,从而“暂停”动画,使其看起来“不完整”。

虽然您可以通过 setDisableActions 禁用隐式动画来解决问题——您可能应该考虑在这里使用 CADisplayLink 是否真的合适。 Core Animation 旨在通过生成自己的中间步骤首先为您生成和运行动画,那么为什么不使用层的 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()

或者如果你想把它作为一个明确的动画:

let anim = CABasicAnimation(keyPath: "strokeEnd")
anim.fromValue = 0
anim.toValue = 1
anim.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
anim.duration = 10
circleLayer.addAnimation(anim, forKey: "strokeEndAnim")

// update model layer value
CATransaction.begin()
CATransaction.setDisableActions(true)
circleLayer.strokeEnd = 1
CATransaction.commit()

关于swift - 使用 CADisplayLink 动画的 CAShapeLayer 描边未完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37180880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com