Анимированный CAGradientLayer в Swift

Вот решение с jQuery, которое работает как шарм. Он проверяет, больше ли высота окна больше высоты тела. Если это так, то он меняет верхний край нижнего колонтитула для компенсации. Тестирование в Firefox, Chrome, Safari и Opera.

$( function () {

    var height_diff = $( window ).height() - $( 'body' ).height();
    if ( height_diff > 0 ) {
        $( '#footer' ).css( 'margin-top', height_diff );
    }

});

Если ваш нижний колонтитул уже имеет верхний край (например, 50 пикселей), вам нужно будет изменить последнюю часть для:

css( 'margin-top', height_diff + 50 )
17
задан Daniel 24 May 2016 в 16:01
поделиться

3 ответа

Я пытался сделать это в Objective-C, и он работает, но мне нужно использовать его в Swift, и когда я запускаю программу, она анимируется, но в конце возвращается к предыдущему цвету, мне это нужно так оставаться синим.

Вам нужно всего лишь:

animation.removedOnCompletion = false // not true like in your code
1
ответ дан Aladin 24 May 2016 в 16:01
поделиться

Для тех, кто в комментариях спрашивает о бесконечной анимации, вот мой базовый пример кода для бесконечно анимированного фона: -

Полное обсуждение и результаты можно увидеть в моем блоге

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // create the gradient layer
        let gradient = CAGradientLayer()
        gradient.frame = self.view.bounds
        gradient.startPoint = CGPoint(x:0.0, y:0.5)
        gradient.endPoint = CGPoint(x:1.0, y:0.5)
        gradient.colors = [UIColor.red.cgColor, UIColor.green.cgColor]
        gradient.locations =  [-0.5, 1.5]

        let animation = CABasicAnimation(keyPath: "colors")
        animation.fromValue = [UIColor.red.cgColor, UIColor.green.cgColor]
        animation.toValue = [UIColor.green.cgColor, UIColor.red.cgColor]
        animation.duration = 5.0
        animation.autoreverses = true
        animation.repeatCount = Float.infinity

        // add the animation to the gradient
        gradient.add(animation, forKey: nil)

        // add the gradient to the view
        self.view.layer.addSublayer(gradient)
    }
 }
3
ответ дан Echelon 24 May 2016 в 16:01
поделиться

Для дальнейшего использования ... 100% загрузка ЦП вызвана функцией animationDidStop. Он перезапускает анимацию, пока текущая анимация не закончена. Пожалуйста, проверьте готовый флаг:

override func animationDidStop(anim: CAAnimation, finished: Bool) {
    if finished {
        self.toColors = self.fromColors;
        self.fromColors = self.gradient?.colors

        animateLayer()
    }
}
1
ответ дан user2152001 24 May 2016 в 16:01
поделиться