2016-03-28 19 views
0

Arka plan degradelerimi kontrol eden anahtar ifadem var. Güzel çalışır (degradeler değişir), ancak aniden değişir. Bu gradyanların birbiri ile .25'lik bir sürede solmasını istiyorum. Bu benim kod girişimi aşağıda. arka kontrolleriSwift - Solmaya devam etmek için animateWithDuration öğesini kullanma CAGradientLayer

Anahtarı ifadesi: Ben

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) 
} 
} 

nasıl ayarlayabilirsiniz hareketlendirmek süresini teşebbüs nerede geçişlerini kontrol eden

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]) 
} 

Uzantısı Bu benim gradyan katmanlarını birinden diğerine taramak için yukarıdaki kodu? (Ilgisiz - sürekli alt katmanlar üzerinde "alt katman eklemek" için bellek için kötü mü?)

+0

Evet, sürekli olarak daha fazla alt tabaka eklemek kötüdür. Bir degrade katman oluşturmalı ve ardından degradeyi güncellemek için özelliklerini değiştirmelisiniz. Bu sorunu düzeltin ve hala sorun yaşıyorsanız yeni kodu kullanarak sorunuzu geri alın ve güncelleyin. –

+0

@robmayoff - Yikes. Buna çok memnun oldum! Buradaki düzeltme, configureGradient işlevinden self.layer.addSublayer (gradientLayer) öğesini kaldırmak ve bunu readyGradient'e taşımak kadar basit midir? (Yukarıdaki kodumu düzenledim.) – Joe

cevap

2

Bu çalışacaktır:

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) 
} 

... zaten sadece rengini değiştirmek için alt katmanlar ekleme hoş değil. Uzantınızda sizin degrade katmanını saklamak için deneyin:

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 alt sınıf uygulamak daha basittir olsun ... Ben bu şekilde yapmak gerektiğini düşünüyorum.

+0

Bu işe yarıyor, evet! Ancak, sürekli olarak yığınlanan alt katmanların başlangıç ​​kodumda bir hata oluştu. İlk kodumda bu işe yaramaya çalışıyorum ve sonra bu soluğu tekrar eklemeye çalışacağım. – Joe

+0

Yanıt düzenlendi ... –

İlgili konular