2016-03-28 8 views
0

私は背景文章勾配を制御するswitch文を持っています。それはうまく動作します(勾配が変化します)。しかし、それは突然変化します。私はこれらのグラデーションが.25の持続時間でお互いに消えるようにしたいと思います。私のコードの試みは以下の通りです。背景制御Swift - animateWithDurationを使用してCAGradientLayerをフェードする

Switchステートメント:私は

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

がどのように調整することができますアニメーションの継続時間を試みたところ勾配を制御

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

拡張が これは私の上記のコードを使ってグラデーションレイヤーをフェードアウトさせますか? (無関係な - それは常にサブレイヤの「サブレイヤーを追加」をメモリに悪いのですか?)

+0

はい、常にサブレイヤを追加するのは悪いことです。 1つのグラデーションレイヤーを作成し、そのプロパティーを変更してグラデーションを更新する必要があります。それでも問題が解決したら、新しいコードで質問を更新して修正してください。 –

+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

回答済み... –

関連する問題