2016-03-28 17 views
0

У меня есть оператор switch, управляющий моими градиентами фона. Он отлично работает (изменение градиентов), однако он резко меняется. Я бы хотел, чтобы эти градиенты исчезали друг с другом с длительностью 0,25. Моя попытка сделать это ниже.Swift - Использование animateWithDuration для выцветания CAGradientLayer

переключатель заявление, которое контролирует фон:

switch backgroundInput{ 
case 50...69: 
self.view.configureGradient([gradientColor1, gradientColor2]) 
case 70...90: 
self.view.configureGradient([gradientColor2, gradientColor3]) 
case 91...110: 
self.view.configureGradient([gradientColor3, gradientColor4]) 
case 111...130: 
self.view.configureGradient([gradientColor4, gradientColor5]) 
case 131...150: 
self.view.configureGradient([gradientColor5, gradientColor6]) 
case 151...170: 
self.view.configureGradient([gradientColor6, gradientColor7]) 
default: 
self.view.configureGradient([lightPurple, lightBlue]) 
} 

Extension, который контролирует градиенты Здесь я попытался длительность анимировать

extension UIView { 
private func prepareGradient() -> CAGradientLayer { 
    let gradientLayer = CAGradientLayer() 
    gradientLayer.frame = self.bounds 
    gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.0) 
    gradientLayer.endPoint = CGPoint(x: 1.0, y: 1.0) 
    gradientLayer.zPosition = -1 
    self.layer.addSublayer(gradientLayer) 
    return gradientLayer 
} 
func configureGradient(colors:[CGColor]) { 
    let gradientLayer = prepareGradient() 
    UIView.animateWithDuration(0.25, delay: 0.0, options: UIViewAnimationOptions.CurveEaseInOut, animations: { 
     gradientLayer.colors = colors 
     }, completion: nil) 
} 
} 

Как я могу настроить мой код выше, чтобы угаснуть градиентные слои от одного к другому? (Несвязанного - это плохо для памяти постоянно «добавить подслой» на подуровни?)

+0

Да, неудобно постоянно добавлять дополнительные подслои. Вы должны создать один слой градиента, а затем изменить его свойства, чтобы обновить градиент. Исправьте это, вернитесь и обновите свой вопрос с помощью нового кода, если у вас все еще есть проблемы. –

+0

@robmayoff - Yikes. Рад, что я поймал это! Является ли исправление здесь столь же простым, как удаление self.layer.addSublayer (gradientLayer) из функции configureGradient и перенос его в prepareGradient? (Я редактировал мой код выше.) – Joe

ответ

2

Это будет работать:

func configureGradient(colors:[CGColor]) { 
    let gradientLayer = prepareGradient() 
    gradientLayer.colors = colors 
    UIView.transitionWithView(self, 
           duration: 0.25, 
           options: UIViewAnimationOptions.TransitionCrossDissolve, 
           animations: { [weak self]() -> Void in 
           self?.layer.addSublayer(gradientLayer) 
     }, completion: nil) 
} 

... в любом случае добавление подслоя только изменить цвет не круто. Попробуйте сохранить свой слой с градиентом в расширении:

private struct AssociatedKeys { 
    static var gradientLayer = CAGradientLayer() 
} 

var gradientLayer: CAGradientLayer { 
    get { 
     guard let gLayer = objc_getAssociatedObject(self, &AssociatedKeys.gradientLayer) as? CAGradientLayer else { return CAGradientLayer() } 
     return gLayer 
    } 
    set(value) { 
     objc_setAssociatedObject(self, &AssociatedKeys.gradientLayer, value, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
    } 
} 

Может быть UIView подкласс более прост в реализации ... Я думаю, что вы должны сделать это таким образом.

+0

Это работает, да! Тем не менее, в моем исходном коде непрерывной укладки подуровней произошла ошибка. Я пытаюсь получить это в своем первоначальном коде, а затем попытаюсь добавить это исчезновение. – Joe

+0

Ответ отредактирован ... –