我可以通过IBAction更改CAGradientLayer()的颜色吗?

时间:2018-12-02 19:10:17

标签: swift cagradientlayer

我定义了以下扩展文件,在其中为UIView设置渐变:

import Foundation
import UIKit

extension UIView {

    func setGradientBackground(colorOne: UIColor, colorTwo: UIColor) {

        let gradientLayer = CAGradientLayer()
        gradientLayer.frame = bounds
        gradientLayer.colors = [colorOne.blue, colorTwo.red]
        gradientLayer.locations = [0.0, 1.0]
        gradientLayer.startPoint = CGPoint(x: 1.0, y: 1.0)
        gradientLayer.endPoint = CGPoint(x: 0.0, y: 0.0)
        layer.insertSublayer(gradientLayer, at: 0)
    }

这链接到一个单独的结构文件,其中我定义了四个UIColor

blue,red,black,white

我的viewcontroller.swift文件在viewDidLoad中包含以下代码:

myView.setGradientBackground(colorOne: Colors.blue, colorTwo: Colors.red)

这似乎很好。

我要达到的目的是,当我单击IBAction按钮时,它将myView的颜色更改为黑白(其余两种颜色)。所以我尝试了这个:

@IBAction func hitButton(_ sender: Any) {

    myView.setGradientBackground(colorOne: Colors.black, colorTwo: Colors.white)

}

但这会导致崩溃:“无法识别的选择器已发送到实例0x7fb25060a120”

1 个答案:

答案 0 :(得分:0)

几件事:

您发布的代码会创建一个渐变层并将其添加到视图中,然后将其忽略。如果不止一次调用它,则结束时会有多个渐变层。那不是你想要的。

您真的想将渐变图层保留为视图的属性。为此,您应该对视图进行子类化,而不是添加扩展名(扩展名不能将存储的属性添加到类中)。

如果您传入用于渐变的颜色,则没有必要再使用colorOne.blue colorTwo.red作为颜色。只需使用传递给您的颜色即可。

CAGradientLayer之类的核心动画层使用CGColors,而不是UIColors。将最后两件事放在一起,这一行:

gradientLayer.colors = [colorOne.blue, colorTwo.red]

应阅读

gradientLayer.colors = [colorOne.cgColor, colorTwo.cgColor]

相反。

您没有说哪一行崩溃了,但是可能将错误的数据类型传递给gradientLayer.colors