【问题标题】:I'd like to create a CAGradientLayer Subclass/Utility class我想创建一个 CAGradientLayer 子类/实用程序类
【发布时间】: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,其颜色已经为我设置好框架并将其插入到我的视图层次结构中做好准备。

【问题讨论】:

    标签: ios swift 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 建议的函数方法证明更优雅。
    猜你喜欢
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 2015-01-01
    相关资源
    最近更新 更多