Как я могу уменьшить потребление энергии от бесконечной CAAnimation? (Анимированный Градиент) - PullRequest
0 голосов
/ 24 мая 2019

Я хочу включить анимированный градиент в свое приложение, и в настоящее время я использую 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)
    }

Код работает просто отлично, и анимацияработает, однако производительность ужасна.У кого-нибудь есть лучшее решение?Я рад любым советам!

...