插入后更改 CAGradientLayer 中的颜色



我有一个类函数来创建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
    }
}
子图层按

从后到前的顺序列出。因此,最后插入新的子图层。或删除旧的。

相关内容

  • 没有找到相关文章

最新更新