如何制作 UIView 子类的 CAGradientLayer 子类支持层

Posted

技术标签:

【中文标题】如何制作 UIView 子类的 CAGradientLayer 子类支持层【英文标题】:How Can I Make CAGradientLayer Subclass Backing Layer of UIView Subclass 【发布时间】:2017-05-25 04:03:17 【问题描述】:

我创建了 CAGradientLayer 的子类,并为 colorsstartPointendPoint 设置了所需的值。它看起来像这样:

public final class GradientBackgroundLayer: CAGradientLayer 

    // MARK: - Properties

    private let leftColor = UIColor(red: 0.96, 
                                    green: 0.64, 
                                    blue: 0.42, 
                                    alpha: 1.00)

    private let rightColor = UIColor(red: 0.88, 
                                     green: 0.36, 
                                     blue: 0.38, 
                                     alpha: 1.00)

    // MARK: - Initialization

    public override init() 
        super.init()
        configure()
    

    public override init(layer: Any) 
        super.init(layer: layer)
        configure()
    

    required public init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

    // MARK: - Helpers

    private func configureColors() 
        colors = [leftColor,
                  rightColor]
    

    private func configureLocations() 
        gradientLayer.locations = [0.1, 
                                   0.9]
        

    private func configure() 
        configureColors()
        configureLocations()
    


我还有一个UIView 的子类,我希望有一个GradientBackgroundLayer 的实例作为其支持layer。它看起来像这样:

public final class GradientView: UIView 

    // MARK: - Properties

    override public class var layerClass: AnyClass 
        return GradientBackgroundLayer.self
    

    // MARK: - Initialization

    public override init(frame: CGRect) 
        super.init(frame: frame)
    

    public required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    


我在 Playground 文件中调用以下初始化程序:

let view = GradientView(frame: CGRect(x: 0, y: 0, width: 400, height: 100))

我得到一个黑色的视图。如果我更改layerbackgroundColor,我会看到它会更新,但我无法弄清楚我做错了什么导致图层不显示渐变。

【问题讨论】:

【参考方案1】:

原来我在设置GradientBackgroundLayercolors 属性时忘记将.cgColor 添加到渐变的颜色中。将所需的 .cgColor 添加到 UIColor 实例解决了我的问题。

【讨论】:

以上是关于如何制作 UIView 子类的 CAGradientLayer 子类支持层的主要内容,如果未能解决你的问题,请参考以下文章

我正在使用 drawRect 实现 UIView 子类:如何绘制按钮?

UIView 子类不能从黑色背景更改

子类化 UIView 或使用 UIView 组合

与 UIView 子类相关的 UIView 元素显示在其容器之外

UIView 子类:drawRect 未调用

将子类 UIView 添加到具有自动布局约束的 Nib