我想创建一个CAGradientLayer子类/实用工具类

时间:2015-12-07 22:03:47

标签: ios swift cagradientlayer

我已经用这种或那种方式编程了30多年,但我是Swift和iOS编程的新手,并在我的第一个应用程序上工作。我已经研究了如何创建一个CAGradientLayer来在屏幕上显示渐变,但我想创建一个实用程序类/扩展/子类,其中包含一些预定义的渐变。

我假设我可以通过使用在初始化时预设的属性创建CAGradientLayer的子类来实现此目的,但我不确定执行此操作的正确语法。我想我错过了一些基本的Swift要求?

我尝试了以下内容:

let greenBlueGradient = GreenBlueGradient.greenBlueGradient()

class GreenBlueGradient: CAGradientLayer {

    override init() {
        super.init()
    }

    func greenBlueGradient() -> GreenBlueGradient {
        self.colors = [ UIColor.init( red: 0.05, green: 0.75, blue: 0.91, alpha: 1.0 ).CGColor, UIColor.init( red: 0.56, green: 0.93, blue: 0.56, alpha: 1.0 ).CGColor ]
        return self
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

但是我在let线上收到错误“在参数#1中缺少参数”。我错过了什么?当然有一种更有效的方法吗?我有点在脑海里,我将能够创建某种实用程序类/扩展,它将返回一个CAGradientLayer,其颜色已经准备就绪,可以设置框架并将其插入到我的视图层次结构中。

2 个答案:

答案 0 :(得分:2)

你应该在其他文件中添加CAGradientLayer的扩展名例如: 在文件" UIExtensionsCAGradientLayer.swift"

extension CAGradientLayer {
    func setupGreenBlurGradient(){
       self.colors = [UIColor.init( red: 0.05, 
                                    green: 0.75, 
                                    blue: 0.91, 
                                    alpha: 1.0).CGColor,
                      UIColor.init( red: 0.56, 
                                    green: 0.93, 
                                    blue: 0.56, 
                                    alpha: 1.0 ).CGColor ]
    }
}

然后在你需要绿色模糊渐变的文件中:

let greenGradientBlur = CAGradientLayer(layer : layer)
greenGradientBlur.setupGreenBlueGradient()

答案 1 :(得分:0)

此处的错误消息有点误导。 (File a bug关于那个。Or fix it yourself,如果你这么倾向,现在Swift是开源的。)

您尝试调用GreenBlueGradient.greenBlueGradient()失败,因为您正在调用实例方法,就好像它是一个类方法一样。如果您将greenBlueGradient()声明为class func,则该调用会成功。但是,该函数的实现依赖于self

您可能想要的是将自定义添加到init

override init() {
    super.init()
    self.colors = [
        UIColor(red: 0.05, green: 0.75, blue: 0.91, alpha: 1.0).CGColor,
        UIColor(red: 0.56, green: 0.93, blue: 0.56, alpha: 1.0).CGColor,
    ]
}

这样,客户端只需构建一个实例即可获得自定义渐变:

let greenBlueGradient = GreenBlueGradient()

顺便说一句,颜色很漂亮。