【问题标题】:Subviews are not displaying for CAGradientLayer added view [duplicate]未显示 CAGradientLayer 添加视图的子视图 [重复]
【发布时间】:2019-03-01 18:44:37
【问题描述】:

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

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 扩展一个类,我如何直接从情节提要属性检查器设置渐变颜色。我在一些库(cosmos)中看到了这一点,我们可以直接设置评级颜色

【问题讨论】:

  • 视图基本上是层,当您在任何视图上添加子层时,层次结构会发生变化。在添加任何新视图或图层之前请注意。
  • 所以渐变层内的子视图是不可能的?或者我需要为超级视图添加渐变层?
  • 是的,在主视图上添加一个带渐变的空视图,然后在主视图上添加新视图是很好的方法。
  • 我没有尝试过其他图层或渐变视图,但是当我需要渐变时,我总是在最后添加它,不管是什么层次结构。
  • 如果您在可重复使用的单元格(集合或表格)上添加此渐变,请尝试在添加新渐变之前删除旧渐变或仅添加一次,这将有助于提高应用性能。

标签: ios swift gradient cagradientlayer


【解决方案1】:

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

渐变视图:

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

【讨论】:

    【解决方案2】:

    看起来您正在直接使用该层并将其添加到视图的支持层。我推荐一个简单的 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
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 2018-09-03
      相关资源
      最近更新 更多