我想创建一个 CAGradientLayer 子类/实用程序类

Posted

技术标签:

【中文标题】我想创建一个 CAGradientLayer 子类/实用程序类【英文标题】:I'd like to create a CAGradientLayer Subclass/Utility class 【发布时间】:2015-12-07 22:03:47 【问题描述】:

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,其颜色已经为我设置好框架并将其插入到我的视图层次结构中做好准备。

【问题讨论】:

【参考方案1】:

您应该在其他文件中添加 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()

【讨论】:

我不得不在这个函数的末尾添加return self,但这正是我想要的。谢谢你。需要在 init() 中进行子类化和设置颜色我在每个子类中实现了许多 required 函数,这会导致代码快速膨胀。 我忘了删除 func 声明中的返回,你不需要返回 :) 请注意UIColor(red:...) 会起作用;你不必说UIColor.init(red:...) 是的,我知道,我只是用他的方法来初始化颜色。我总是使用UIColor(...)【参考方案2】:

这里的错误信息有点误导。 (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()

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

【讨论】:

感谢您的建议。我这样做了,但是 CAGradientLayer(或者更可能是 CALayer)需要我实现许多 required 函数,当为不同的渐变多次覆盖它时会导致巨大的代码膨胀。使用@Coyote 建议的函数方法证明更优雅。

以上是关于我想创建一个 CAGradientLayer 子类/实用程序类的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableViewCell 子类中添加 CAGradientLayer 需要帮助

Swift 中的 CAGradientLayer 位置

用于不同视图的 CAGradientLayer

CAGradientLayer 不改变背景颜色

如何将 CAGradientLayer 应用于 UINavigationController 背景

在两个 CAGradientLayer 颜色设置之间连续渐变?