Я анимирую цвет CAShapeLayers
, хранящийся в массиве, используя CABasicAnimation.Анимация отображается неустойчиво в зависимости от animation.duration
, и я не могу понять, почему.Я подозреваю, что проблема с animation.beginTime = CACurrentMediaTime() + delay
Описание анимации
Анимация состоит в том, что фигуры последовательно мигают желтым, а затем по окончании анимации превращаются в черные.
Текущее состояние анимации
Когда продолжительность анимации превышает определенное время, она работает правильно.
- Например, спродолжительность 2 секунды:
Но когда я сокращаю продолжительность, результат существенно отличается.
- Например, с продолжительностью 1 секунда:
Вы заметите, что анимация имеетуже кэширован / закончен для первых 10 тактов или около того, затем ждет и начинает анимировать оставшуюся часть фигур.
- Аналогично, с длительностью 0,5 с:
В этом случае, кажется, еще большее количество анимации ужеded (фигуры черного цвета), прежде чем он отобразит анимацию через определенное время.Вы также можете заметить, что, хотя цветовая анимация формы должна длиться одинаково (0,5 с), некоторые чувствуют себя быстрее, чем другие.
Код
Анимация вызывается в методе viewDidAppear класса UIViewController.
Я создал пользовательский класс UIView для рисования своих фигур и анимировал их, используя расширение класса.
Код для анимации цвета:
enum ColorAnimation{
case continuousSwap
case continousWithNewColor(color: UIColor)
case randomSwap
case randomWithNewColor(color: UIColor)
case randomFromUsedColors
}
func animateColors(for duration: Double,_ animationType: ColorAnimation, colorChangeDuration swapColorDuration: Double){
guard abs(swapColorDuration) != Double.infinity else {
print("Error in defining the shape color change duration")
return
}
let animDuration = abs(duration)
let swapDuration = abs(swapColorDuration)
let numberOfSwaps = Int(animDuration / min(swapDuration, animDuration))
switch animationType {
case .continousWithNewColor(color: let value):
var fullAnimation = [CABasicAnimation]()
for i in (0...numberOfSwaps) {
let index = i % (self.pLayers.count)
let fromValue = pLayers[index].pattern.color
let delay = Double(i) * swapDuration / 3
let anim = colorAnimation(for: swapDuration, fromColor: value, toColor: fromValue, startAfter: delay)
fullAnimation.append(anim)
}
for i in (0...numberOfSwaps) {
CATransaction.begin()
let index = i % (self.pLayers.count)
CATransaction.setCompletionBlock {
self.pLayers[index].shapeLayer.fillColor = UIColor.black.cgColor
}
pLayers[index].shapeLayer.add(fullAnimation[i], forKey: "fillColorShape")
CATransaction.commit()
}
default:
()
}
}
Сегментирует всю продолжительность анимации по продолжительности изменения цвета ( например, , если вся анимация равна 10 с и каждая фигура меняет цветв 1 с, это означает, что 10 фигур будут менять цвет).Затем я создаю объекты CABasicaAnimation с помощью метода colorAnimation (for: fromColor, toColor, startAfter:).
func colorAnimation(for duration: TimeInterval, fromColor: UIColor, toColor: UIColor, reverse: Bool = false, startAfter delay: TimeInterval) -> CABasicAnimation {
let anim = CABasicAnimation(keyPath: "fillColor")
anim.fromValue = fromColor.cgColor
anim.toValue = toColor.cgColor
anim.duration = duration
anim.autoreverses = reverse
anim.beginTime = CACurrentMediaTime() + delay
return anim
}
Наконец, я добавляю анимацию к соответствующему CAShapeLayer.Код, очевидно, можно оптимизировать, но я решил пойти по этим шагам, чтобы попытаться выяснить, почему он не работает должным образом.
Пока предпринимаются попытки
Пока что япробовал:
с и без установки animation.beginTime
в методе colorAnimation, в том числе с и без CACurrentMediaTime()
: если я не установил animation.beginTime
с CACurrentMediaTime
Я просто не вижу никакой анимации.
с указанием и без указания animation.delegate = self
: ничего не изменилось.
с использованием DispatchQueue (сохраните анимацию в глобальном и запустите ее в основном), и, как подозревалось, фигуры не анимировались.
Я подозреваю, что что-то не работает должным образом с beginTime, но это может быть не такили только потому, что даже когда фигуры анимируются, продолжительность анимации фигуры может меняться, хотя и не должна.
Заранее большое спасибо, чтобы взглянуть на эту проблему.Любые мысли приветствуются, даже если они кажутся надуманными, они могут открыть новые способы решения этой проблемы!
Best,