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
}
}
使用下面的代码为视图添加渐变层。向视图添加渐变层后,如果我尝试在我的渐变视图中添加新的子视图,则新视图不会显示
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
}
}