2016-03-28 34 views
0

我有switch語句控制我的背景漸變。它很好地工作(梯度改變),但它突然改變。我希望這些漸變能夠以0.25的持續時間淡入對方。我的代碼嘗試在這下面。Swift - 使用animateWithDuration淡出CAGradientLayer

控制的背景switch語句:控制梯度

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 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。很高興我抓住了!這裏的修復就像從configureGradient函數中刪除self.layer.addSublayer(gradientLayer)一樣簡單,然後將它移動到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

Answer edited ... –