ios - Swift - 使用 animateWithDuration 淡化 CAGradientLayer

标签 ios swift fade cagradientlayer animatewithduration

我有 switch 语句控制我的背景渐变。它工作得很好(渐变变化),但它突然变化。我希望这些渐变以 0.25 的持续时间相互淡入淡出。我的代码尝试如下。

控制背景的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)
}
}

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

最佳答案

这会起作用:

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 子类更易于实现...我认为您应该这样做。

关于ios - Swift - 使用 animateWithDuration 淡化 CAGradientLayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36271146/

相关文章:

swift - 如何比较 Swift 中的泛型对象?

swift - Swift "as"和 "as!"类型转换操作有什么区别?

JQuery,在 jsfiddle 中工作但不在现场的 li 元素的淡入循环

ios - XCTest 单独通过,与其他测试一起运行时失败

ios - 将数组附加到多维数组

javascript - 使用 Div 创建 Jquery Dropdown 并保持双悬停

android - 如何在相同的 View 上同时播放 Fade 和 Slide 过渡?

ios - iTunes 连接上的 IAD 错误?

iphone - 导航 Controller 标题

ios - UICollectionViewCell 约束问题