Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 我可以通过iAction更改CAGradientLayer()颜色吗?_Swift_Cagradientlayer - Fatal编程技术网

Swift 我可以通过iAction更改CAGradientLayer()颜色吗?

Swift 我可以通过iAction更改CAGradientLayer()颜色吗?,swift,cagradientlayer,Swift,Cagradientlayer,我在为UIView设置渐变的位置定义了以下扩展文件: import Foundation import UIKit extension UIView { func setGradientBackground(colorOne: UIColor, colorTwo: UIColor) { let gradientLayer = CAGradientLayer() gradientLayer.frame = bounds gradient

我在为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)
    }
这链接到一个单独的structs文件,我在其中定义了四个
UIColor
s:

blue,red,black,white
My viewcontroller.swift文件在
viewDidLoad
中包含以下代码:

myView.setGradientBackground(colorOne: Colors.blue, colorTwo: Colors.red)
这似乎很有效

我试图实现的是,当我单击我的
iAction
按钮时,它将
myView
颜色更改为黑色和白色(其余两种颜色)。所以我试了一下:

@IBAction func hitButton(_ sender: Any) {

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

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

以下几点:

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

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

如果您传入用于渐变的颜色,那么使用
colorOne.blue
colorTwo.red
作为颜色是没有意义的。只需使用传递给您的颜色即可

核心动画层(如
CAGradientLayer
s)使用CGColors,而不是UIColors。把最后两件事放在一起,这一行:

gradientLayer.colors = [colorOne.blue, colorTwo.red]
应该读

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

您不会说哪一行正在崩溃,但将错误的数据类型传递到
gradientLayer.colors
可能是罪魁祸首