CALayer уже присутствует на экране перед анимацией - PullRequest
1 голос
/ 25 апреля 2019

Итак, у меня есть гистограмма, где каждый столбец представляет собой 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 Ответ

1 голос
/ 25 апреля 2019

Если вы хотите, чтобы у слоя отображался fromValue для времени до его начала (как установлено с помощью beginTime), вы можете настроить его на заполнение "назад", установив fillMode в .backwards

animation.fillMode = .backwards

Без этого анимация будет отображать значение модели (высоту фактического кадра слоя) за все время до beginTime и после beginTime + duration:

enter image description here

С этим изменением анимация заполнит любое значение до времени начала с помощью fromValue (путем фиксирования любого времени до времени начала до начала анимации):

enter image description here

...