Swift 我可以通过iAction更改CAGradientLayer()颜色吗?
我在为UIView设置渐变的位置定义了以下扩展文件: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
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
可能是罪魁祸首