没有为CAGradientLayer添加的视图显示子视图

时间:2018-09-26 04:45:01

标签: ios swift gradient cagradientlayer

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

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扩展类,如何直接从故事板属性检查器设置渐变颜色。我在某些库(波斯菊)中已经看到了这一点,我们可以直接设置评级颜色

2 个答案:

答案 0 :(得分:1)

创建uiview的子类并使用gradientLayer覆盖layer属性,而不是添加渐变层

渐变视图:

rows

使用:

@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)
    }
}

答案 1 :(得分:0)

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

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

import UIKit

public class AxialGradientView: UIView {

    public var colors: [UIColor] = [] {
        didSet {
            gradientLayer.colors = colors.map { $0.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
    }

}