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

Posted

技术标签:

【中文标题】我可以通过 IBAction 更改 CAGradientLayer() 颜色吗?【英文标题】:Can I change CAGradientLayer() colors via an IBAction? 【发布时间】:2018-12-02 19:10:17 【问题描述】:

我在为 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)
    

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

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】:

几件事:

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

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

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

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

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

应该读

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

改为。

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

【讨论】:

以上是关于我可以通过 IBAction 更改 CAGradientLayer() 颜色吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 IBAction 更改标签文本不起作用?

如何在单元格对象中更改 UICollectionViewcell 大小形式的 IBAction

如何让 UILabel 响应 IBAction?

在 IBAction 中禁用的 UIButton 重新启用自身

为啥我不能从情节提要创建 IBAction

如何在 viewDidLoad 中调用 IBAction?