通过Sublayer改变UIView的渐变背景
Change Gradient Background of UIView Through Sublayer
我在 UIView
的扩展中定义了这个函数,我用它来设置 UIView
:
上的渐变背景
func setGradientBackground(colorTop: UIColor, colorBottom: UIColor, withCornerRadius : CGFloat){
let gradientLayer = CAGradientLayer()
gradientLayer.colors = [colorBottom.cgColor, colorTop.cgColor]
gradientLayer.startPoint = CGPoint(x: 0.5, y: 1.0)
gradientLayer.endPoint = CGPoint(x: 0.5, y: 0.0)
gradientLayer.locations = [0, 1]
gradientLayer.frame = bounds
gradientLayer.cornerRadius = withCornerRadius
layer.insertSublayer(gradientLayer, at: 0)
}
用法如下:
view.setGradientBackground(colorTop: UIColor.blue, colorBottom: UIColor.red, withCornerRadius: 10)
问题是,如果我已经在一个视图上调用过一次这个函数,第二次调用它时,它什么也没做。我怀疑这是由 subLayer
从上一次插入中持续存在引起的。
我试过添加:
if layer.sublayers?.count ?? 0 > 0 {
layer.sublayers?.remove(at: 0)
}
到该函数的顶部,但这会导致代码崩溃并出现 BAD_INSTRUCTION
异常。
您可以获得渐变图层,并可以从视图中任何您想要的位置移除...不仅仅是再次添加它,您还可以将其移除...
if let gradientLayer = (yourView.layer.sublayers?.compactMap { [=10=] as? CAGradientLayer })?.first {
print("gradientLayer is presnet")
gradientLayer.removeFromSuperlayer()
} else {
print("its not added on layer yet")
}
最简单的选择是检查图层的子图层是否为渐变图层。这不是完全安全的,因为如果您碰巧在子层的索引 0 处有另一个渐变层,它将更改不正确的子层。
func setGradientBackground(colorTop: UIColor, colorBottom: UIColor, withCornerRadius cornerRadius: CGFloat) {
let gradientLayer = layer.sublayers?.first as? CAGradientLayer ?? CAGradientLayer()
// The rest of your existing layer customization code here
guard gradientLayer.superlayer != self else {
return
}
layer.sublayers?.insertSublayer(gradientLayer, at: 0)
}
我在 UIView
的扩展中定义了这个函数,我用它来设置 UIView
:
func setGradientBackground(colorTop: UIColor, colorBottom: UIColor, withCornerRadius : CGFloat){
let gradientLayer = CAGradientLayer()
gradientLayer.colors = [colorBottom.cgColor, colorTop.cgColor]
gradientLayer.startPoint = CGPoint(x: 0.5, y: 1.0)
gradientLayer.endPoint = CGPoint(x: 0.5, y: 0.0)
gradientLayer.locations = [0, 1]
gradientLayer.frame = bounds
gradientLayer.cornerRadius = withCornerRadius
layer.insertSublayer(gradientLayer, at: 0)
}
用法如下:
view.setGradientBackground(colorTop: UIColor.blue, colorBottom: UIColor.red, withCornerRadius: 10)
问题是,如果我已经在一个视图上调用过一次这个函数,第二次调用它时,它什么也没做。我怀疑这是由 subLayer
从上一次插入中持续存在引起的。
我试过添加:
if layer.sublayers?.count ?? 0 > 0 {
layer.sublayers?.remove(at: 0)
}
到该函数的顶部,但这会导致代码崩溃并出现 BAD_INSTRUCTION
异常。
您可以获得渐变图层,并可以从视图中任何您想要的位置移除...不仅仅是再次添加它,您还可以将其移除...
if let gradientLayer = (yourView.layer.sublayers?.compactMap { [=10=] as? CAGradientLayer })?.first {
print("gradientLayer is presnet")
gradientLayer.removeFromSuperlayer()
} else {
print("its not added on layer yet")
}
最简单的选择是检查图层的子图层是否为渐变图层。这不是完全安全的,因为如果您碰巧在子层的索引 0 处有另一个渐变层,它将更改不正确的子层。
func setGradientBackground(colorTop: UIColor, colorBottom: UIColor, withCornerRadius cornerRadius: CGFloat) {
let gradientLayer = layer.sublayers?.first as? CAGradientLayer ?? CAGradientLayer()
// The rest of your existing layer customization code here
guard gradientLayer.superlayer != self else {
return
}
layer.sublayers?.insertSublayer(gradientLayer, at: 0)
}