我有一个类函数来创建CAGradient层并将其插入到正常工作的UIView中。
但是,我想在显示页面后修改渐变,并且重新执行相同的功能不起作用。
在显示的页面上,我使用滑块将新颜色设置为两个 UIButton 背景,并调用下面的函数。我希望当我更改滑块时,渐变层背景会发生变化,但它没有。我已经验证了正在调用该函数并且颜色值有效。
如何在移动滑块时更改渐变?
下面是类函数:
class func setGradientBG(_ firstColor: CGColor, secondColor: CGColor, vertical: Bool, thisView: UIView){
let gradientLayer = CAGradientLayer()
gradientLayer.frame = thisView.bounds
gradientLayer.colors = [firstColor, secondColor]
gradientLayer.locations = [0.0, 1.2]
if !vertical{
gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.0)
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.0)
}
thisView.layer.insertSublayer(gradientLayer, at: 0)
}
这是从滑块调用的函数:
func doSlider(){
CommonFuncs.setGradientBG((self.TopColorBut.backgroundColor?.cgColor)!, secondColor: (self.BottomColorBut.backgroundColor?.cgColor)!, vertical: true, thisView: self.view)
}
调用setGradientBG
时,您都会添加另一个CAGradientLayer
实例。你真的认为这是个好主意吗?
看起来您的doSlider
方法可能是自定义UIViewController
子类的一部分。您应该做的是在视图控制器中存储对渐变图层的引用,并更新该现有图层。例:
class ViewController: UIViewController {
private let gradientLayer = CAGradientLayer()
@IBOutlet var topColorButton: UIButton!
@IBOutlet var bottomColorButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
view.layer.insertSublayer(gradientLayer, at: 0)
self.updateGradientLayer()
}
@IBAction func doSlider() {
updateGradientLayer()
}
private func updateGradientLayer() {
gradientLayer.locations = [ 0.0, 1.2 ]
gradientLayer.startPoint = .zero
gradientLayer.endPoint = CGPoint(x: 0, y: 1)
gradientLayer.colors = [
(topColorButton.backgroundColor ?? .clear).cgColor,
(bottomColorButton.backgroundColor ?? .clear).cgColor ]
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
gradientLayer.frame = view.bounds
}
}
从后到前的顺序列出。因此,最后插入新的子图层。或删除旧的。