Я хочу включить анимированный градиент в свое приложение, и в настоящее время я использую CATransition для этой задачи.Однако анимация имеет очень высокое энергопотребление как на iOS, так и на macOS (я разрабатываю оба приложения).У кого-нибудь есть идеи как это исправить?Есть ли библиотека, которая работает лучше или я могу использовать другую анимацию?
Код, который у меня сейчас есть, выглядит следующим образом:
var gradient = CAGradientLayer()
var color = 0
var animationGradient = [CGColor(red: 0.94, green: 0.32, blue: 0.31, alpha: 1.00),
CGColor(red: 0.93, green: 0.25, blue: 0.48, alpha: 1.00),
CGColor(red: 0.67, green: 0.28, blue: 0.74, alpha: 1.00),
CGColor(red: 0.50, green: 0.34, blue: 0.76, alpha: 1.00),
CGColor(red: 0.48, green: 0.53, blue: 0.80, alpha: 1.00),
CGColor(red: 0.26, green: 0.65, blue: 0.96, alpha: 1.00),
CGColor(red: 0.16, green: 0.71, blue: 0.96, alpha: 1.00),
CGColor(red: 0.15, green: 0.78, blue: 0.85, alpha: 1.00),
CGColor(red: 0.15, green: 0.65, blue: 0.61, alpha: 1.00),
CGColor(red: 0.40, green: 0.73, blue: 0.41, alpha: 1.00),
CGColor(red: 0.61, green: 0.80, blue: 0.40, alpha: 1.00),
CGColor(red: 0.83, green: 0.88, blue: 0.34, alpha: 1.00),
CGColor(red: 1.00, green: 0.93, blue: 0.35, alpha: 1.00),
CGColor(red: 1.00, green: 0.79, blue: 0.16, alpha: 1.00),
CGColor(red: 1.00, green: 0.65, blue: 0.15, alpha: 1.00),
CGColor(red: 1.00, green: 0.44, blue: 0.26, alpha: 1.00)]
var animationIndex = 0
var fromColors: [CGColor] = []
var toColors: [CGColor] = []
func createGradient() {
fromColors = [CGColor(red: 1.00, green: 1.00, blue: 1.00, alpha: 1.00),
CGColor(red: 1.00, green: 1.00, blue: 1.00, alpha: 1.00)]
toColors = [CGColor(red: 0.67, green: 0.28, blue: 0.74, alpha: 1.00),
CGColor(red: 0.16, green: 0.71, blue: 0.96, alpha: 1.00)]
gradient.colors = fromColors
gradient.startPoint = CGPoint(x: 0.0, y: 1.0)
gradient.endPoint = CGPoint(x: 1.0, y: 0.0)
gradient.frame = CGRect(x: 0.0, y: 0.0, width: self.view.frame.size.width, height: self.view.frame.size.height)
self.view.layer?.insertSublayer(gradient, at: 100)
animateLayer(withDuration: 0.5)
}
func animateLayer(withDuration duration: Double){
var animation = CATransition()
animation.duration = duration
animation.isRemovedOnCompletion = true
animation.fillMode = .forwards
animation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
animation.delegate = self as? CAAnimationDelegate
animation.type = .fade
self.gradient.add(animation, forKey:"animateGradient")
gradient.colors = toColors
}
func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
self.fromColors = toColors
color = (color + Int.random(in: 2...6)) % animationGradient.count
toColors = [fromColors[1],
animationGradient[color]]
animateLayer(withDuration: 6.00)
}
Код работает просто отлично, и анимацияработает, однако производительность ужасна.У кого-нибудь есть лучшее решение?Я рад любым советам!