当点击按钮时,渐变的UIView不会改变颜色

问题描述 投票:2回答:1

[当用户单击按钮时,它将用于在大圆圈中创建渐变的颜色随机化。在其下面是两个小圆圈,显示用于渐变的纯色。它们都在开始时正确显示(主圆圈是随机的较小圆圈的颜色的渐变),但是当我单击按钮时,只有较小的圆圈会更改颜色;大圆圈保持相同的渐变颜色。

扩展和视图控制器:

extension UIView {
func setupGradientBackground(colorOne: UIColor, colorTwo: UIColor) {
        let gradientLayer: CAGradientLayer = CAGradientLayer()
        gradientLayer.colors = [colorOne.cgColor, colorTwo.cgColor]
        gradientLayer.locations = [0.0, 1.0]
        gradientLayer.startPoint = CGPoint(x: 0.0, y: 1.0)
        gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.0)
        gradientLayer.frame = self.bounds

        self.layer.insertSublayer(gradientLayer, at: 0)
    }
}

extension UIColor {
     static var random: UIColor {
        return UIColor(red: .random(in: 0...1), green: .random(in: 0...1), blue: .random(in: 0...1), alpha: 1.0)
    }
}

class GradientController: UIViewController {
    let gradientView = GradientView()
    let leftGradientColor: UIColor = .random
    let rightGradientColor: UIColor = .random
}

    override func viewDidLoad() {
        super.viewDidLoad()
        view = gradientView
        newGradient()
    }

    func newGradient() {
        gradientView.mainCircleView.setupGradientBackground(colorOne: leftGradientColor, colorTwo: rightGradientColor)
        gradientView.colorCircleLeftView.backgroundColor = leftGradientColor
        gradientView.colorCircleRightView.backgroundColor = rightGradientColor
        gradientView.gradientGenerateButton.addTarget(self, action: #selector(randomGradient(sender:)), for: .touchUpInside)
    }

    @objc func randomGradient(sender: UIButton)
    {
        let leftGradient = UIColor.random
        let rightGradient = UIColor.random

        gradientView.colorCircleLeftView.backgroundColor = leftGradient
        gradientView.colorCircleRightView.backgroundColor = rightGradient

        //Here is where it's not changing colors. Doesn't seem like the VC recognizes it in this function
        gradientView.mainCircleView.setupGradientBackground(colorOne: leftGradient, colorTwo: rightGradient)
    }

查看:

class GradientView: UIView {
//circle's UIView code in Extensions
    let mainCircleView = UIView().circleView(width: 380, height: 380)
    let colorCircleLeftView = UIView().circleView(width: 40, height: 40)
    let colorCircleRightView = UIView().circleView(width: 40, height: 40)

...

    func setupLayout() {
    ...
    }
}

我尝试将mainCircleView颜色更改为纯色UIColor,例如gradientView.mainCircleView.setupGradientBackground(colorOne: .red, colorTwo: .orange),以查看主圆是否在func newGradient()@objc func randomGradient(sender: UIButton)中都更改为这些颜色。它仅在func newGradient()中更改了我手动设置的内容,因此这意味着VC无法识别@objc func中的主圆,但是我不知道如何解决它...

感谢您的任何帮助!

单击“生成”按钮时的外观(大圆圈应显示为棕色和紫色)​​:enter image description here

ios swift cagradientlayer
1个回答
0
投票

渐变不会更改,因为您在现有渐变之下添加了新渐变

extension UIView {

    func setupGradientBackground(colorOne: UIColor, colorTwo: UIColor) {
        let gradientLayer: CAGradientLayer = CAGradientLayer()

        ...

        // ⬇ There is a mistake. 
        self.layer.insertSublayer(gradientLayer, at: 0)
    }
}

您应该使用此新梯度来更改当前梯度。或在旧的上方插入新的。

© www.soinside.com 2019 - 2024. All rights reserved.