在为动画设置动画之前,CALayer已经出现在屏幕上

时间:2019-04-25 16:27:54

标签: ios swift calayer

所以我有一个条形图,其中每个条形都是 CALayer 。我想为每个图层设置不同的延迟动画。

private func drawBar(xPos: CGFloat, yPos: CGFloat, color: UIColor) {
    // create animation
    let animation = CABasicAnimation(keyPath: "bounds.size.height")
    animation.beginTime = CACurrentMediaTime() + StaticVars.delay
    animation.fromValue = 0
    animation.toValue = mainLayer.frame.height - bottomSpace - yPos
    animation.duration = 2.0
    StaticVars.delay += 0.1

    // create bar
    let barLayer = CALayer()
    barLayer.anchorPoint = CGPoint(x: 1, y: 1)
    barLayer.frame = CGRect(x: xPos, y: yPos, width: barWidth, height: mainLayer.frame.height - bottomSpace - yPos)
    barLayer.backgroundColor = color.cgColor
    barLayer.add(animation, forKey: nil)
    mainLayer.addSublayer(barLayer)
}

这很好用,但是有一个问题:图表已经存在于屏幕上,它等待延迟(0.1),然后开始为每个图层添加延迟动画。

我不明白为什么图表已经显示。我想要的是,当应用程序出现在屏幕上时,条形图应该不可见,只是在第一个延迟之后,图表才开始动画。

1 个答案:

答案 0 :(得分:1)

如果您希望图层在开始之前的时间里看起来像是fromValue(使用beginTime进行设置),则可以通过设置{{1 }}到.backwards

fillMode

否则,动画将在beginTime之前,beginTime +持续时间之后的所有时间显示模型值(图层的实际帧的高度):

enter image description here

进行此更改后,动画将在开始时间之前用animation.fillMode = .backwards 填充任何值(通过将开始时间之前的任何时间限制到动画开始):

enter image description here