我想创建一个 CAGradientLayer Subclass/Utility class
I'd like to create a CAGradientLayer Subclass/Utility class
我已经以这种或那种方式编程 30 多年了,但我对 Swift 和 iOS 编程和开发我的第一个应用程序还是个新手。我已经了解如何创建 CAGradientLayer 以在屏幕上显示渐变,但我想创建一个实用程序 class/extension/subclass,其中包含一些预定义的渐变。
我假设我可以通过在初始化时使用预先设置的属性创建 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 行收到错误 "Missing argument for parameter #1 in call"。我错过了什么?当然有更有效的方法吗?我有点想我将能够创建某种实用程序 class/extension,它将 return 一个颜色已经设置好的 CAGradientLayer 准备好设置框架并将其插入我的视图层次结构。
这里的错误信息有点误导。 (File a bug about that. Or fix it yourself,如果您愿意,现在 Swift 是开源的。)
您尝试调用 GreenBlueGradient.greenBlueGradient()
失败,因为您正在调用实例方法,就好像它是 class 方法一样。 如果您将 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()
顺便说一下,漂亮的颜色。
例如,您应该在其他文件中添加 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()
我已经以这种或那种方式编程 30 多年了,但我对 Swift 和 iOS 编程和开发我的第一个应用程序还是个新手。我已经了解如何创建 CAGradientLayer 以在屏幕上显示渐变,但我想创建一个实用程序 class/extension/subclass,其中包含一些预定义的渐变。
我假设我可以通过在初始化时使用预先设置的属性创建 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 行收到错误 "Missing argument for parameter #1 in call"。我错过了什么?当然有更有效的方法吗?我有点想我将能够创建某种实用程序 class/extension,它将 return 一个颜色已经设置好的 CAGradientLayer 准备好设置框架并将其插入我的视图层次结构。
这里的错误信息有点误导。 (File a bug about that. Or fix it yourself,如果您愿意,现在 Swift 是开源的。)
您尝试调用 GreenBlueGradient.greenBlueGradient()
失败,因为您正在调用实例方法,就好像它是 class 方法一样。 如果您将 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()
顺便说一下,漂亮的颜色。
例如,您应该在其他文件中添加 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()