Ios Swift-使用animateWithDuration淡入CAGradientLayer

Ios Swift-使用animateWithDuration淡入CAGradientLayer,ios,swift,fade,cagradientlayer,animatewithduration,Ios,Swift,Fade,Cagradientlayer,Animatewithduration,我有开关语句控制我的背景梯度。它工作得很好(渐变变化),但变化很突然。我想让这些渐变以0.25的持续时间彼此淡入。下面是我的代码尝试 控制背景的开关语句: switch backgroundInput{ case 50...69: self.view.configureGradient([gradientColor1, gradientColor2]) case 70...90: self.view.configureGradient([gradientColor2, gradientColor

我有开关语句控制我的背景梯度。它工作得很好(渐变变化),但变化很突然。我想让这些渐变以0.25的持续时间彼此淡入。下面是我的代码尝试

控制背景的开关语句:

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])
}
控制渐变的扩展 这就是我尝试设置动画持续时间的地方

如何调整上面的代码,使gradientlayers从一个渐变到另一个渐变?(无关-不断在子层上“添加子层”对内存有害吗?

这将起作用:

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子类实现起来更简单。。。我认为你应该这样做。

这将起作用:

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子类实现起来更简单。。。我认为您应该这样做。

是的,不断添加更多的子层是不好的。您应该创建一个渐变层,然后修改其属性以更新渐变。修复这个问题,然后回来用新代码更新你的问题,如果你仍然有问题。@robmayoff-Yikes。很高兴我听到了!这里的修复是否简单到从configureGradient函数中删除self.layer.addSublayer(gradientLayer)并将其移动到prepareGradient?(我已经编辑了上面的代码。)是的,不断添加更多的子层是不好的。您应该创建一个渐变层,然后修改其属性以更新渐变。修复这个问题,然后回来用新代码更新你的问题,如果你仍然有问题。@robmayoff-Yikes。很高兴我听到了!这里的修复是否简单到从configureGradient函数中删除self.layer.addSublayer(gradientLayer)并将其移动到prepareGradient?(我已经编辑了上面的代码。)这确实有效,是的!然而,在我最初连续堆叠子层的代码中有一个bug。我正在尝试在我的初始代码中解决这个问题,然后将尝试添加这个淡入。这确实有效,是的!然而,在我最初连续堆叠子层的代码中有一个bug。我试图在我的初始代码中解决这个问题,然后将尝试添加这个淡入淡出。