CAGradientLayer 添加的视图不显示子视图

Subviews are not displaying for CAGradientLayer added view

使用下面的代码为视图添加渐变层。向视图添加渐变层后,如果我尝试在我的渐变视图中添加新的子视图,则新视图不会显示

func setGradientBackground(_ view: UIView ,colorStart:CGColor ,colorEnd:CGColor,cornerRadius:CGFloat) {
let gradientLayer = CAGradientLayer()

gradientLayer.colors = [colorStart, colorEnd]
gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5);
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5);

gradientLayer.frame = view.bounds
gradientLayer.cornerRadius = cornerRadius

view.layer.addSublayer(gradientLayer)
}  

如果我使用 UIView 扩展 class,我如何直接从故事板属性检查器设置渐变颜色。我在一些库 (cosmos) 中看到了这一点,我们可以直接设置评级颜色

创建 uiview 的子类并使用 gradientLayer

覆盖层 属性,而不是添加渐变层

渐变视图:

@IBDesignable class VerticalGradientView: UIView {
    @IBInspectable var topColor: UIColor = UIColor.red {
        didSet {
            setGradient()
        }
    }
    @IBInspectable var bottomColor: UIColor = UIColor.blue {
        didSet {
            setGradient()
        }
    }

    override class var layerClass: AnyClass {
        return CAGradientLayer.self
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        setGradient()
    }

    private func setGradient() {
        (layer as! CAGradientLayer).colors = [topColor.cgColor, bottomColor.cgColor]
        (layer as! CAGradientLayer).startPoint = CGPoint(x: 0.5, y: 0)
        (layer as! CAGradientLayer).endPoint = CGPoint(x: 0.5, y: 1)
    }
}

使用:

let gradientView = VerticalGradientView()
gradientView.frame = CGRect(0,0,100,100)
gradientView.topColor = .black

let label = UILabel()
gradientView.addSubview(label)

看起来您正在直接使用图层并将其添加到视图的支持图层。我推荐一个简单的 UIView 子类,它封装了渐变行为。实现非常简单,最大的好处是您可以控制它在 z 维度中的渲染位置。然后你可以只使用渐变视图作为你的内容的父视图,或者如果这在你的特定场景中不合理,你可以使用 UIView 的 UIView.insert(_:,at:) 方法将渐变视图作为子视图插入索引 0实例。这将使您的渐变视图显示在您稍后添加的其他视图下方。

我最近开始在我的一个应用程序中使用渐变。这是我用来定义自定义渐变类型的代码。

import UIKit

public class AxialGradientView: UIView {

    public var colors: [UIColor] = [] {
        didSet {
            gradientLayer.colors = colors.map { [=10=].cgColor }
        }
    }

    /// Expressed in a unit coordinate system.
    public var startPoint: CGPoint = CGPoint(x: 0.5, y: 0) {
        didSet {
            gradientLayer.startPoint = startPoint
        }
    }

    /// Expressed in a unit coordinate system.
    public var endPoint: CGPoint = CGPoint(x: 0.5, y: 1) {
        didSet {
            gradientLayer.endPoint = endPoint
        }
    }

    override public class var layerClass: Swift.AnyClass {
        get {
            return CAGradientLayer.self
        }
    }

    private var gradientLayer: CAGradientLayer {
        return layer as! CAGradientLayer
    }

}