UIView 中的径向渐变颜色未更新

Radial Gradience Colors Not Updating in UIView

我正在尝试在我的应用程序中的背景 UIView 上使用径向渐变。我的问题来了,我想多次更新渐变的视图颜色。我的代码没有错误,但我似乎无法弄清楚如何解决这个问题。

我尝试过在常规 UIView 中重新加载输入视图以及渐变 class;删除 uiview 的子视图,并向屏幕添加一个新视图,这仅适用于更改设置的颜色;我已经查看了互联网,但似乎无法解决这个问题。我只想让 UIView 根据我给它的新颜色参数更新它的颜色。

这是我的径向渐变代码:

import UIKit

class RadialGradient: UIView {


    var innerColor = UIColor.yellow
    var outterColor = UIColor.red

    override func draw(_ rect: CGRect) {

        let colors = [innerColor.cgColor, outterColor.cgColor] as CFArray
        let endRadius = min(frame.width, frame.height)

        let center = CGPoint(x: bounds.size.width/2, y: bounds.size.height/2)

        let gradient = CGGradient(colorsSpace: nil, colors: colors, locations: nil)

        UIGraphicsGetCurrentContext()!.drawRadialGradient(gradient!,
            startCenter: center,
            startRadius: 0.0,
            endCenter: center,
            endRadius: endRadius,
            options: CGGradientDrawingOptions.drawsAfterEndLocation)


    }

}

这里是我使用它的地方:

import UIKit

class TestIssuesVC: UIViewController {

    var check : Bool = false

    @IBAction func buttonClicked(_ sender: Any) {

        if check == true {
            backgroundsetting.removeFromSuperview()
            print("Why wont you change to purple and black?????")
            cheapFix(inner: UIColor.purple, outter: UIColor.black)

        } else {

        backgroundsetting.removeFromSuperview()

        cheapFix(inner: UIColor.red, outter: UIColor.blue)
            check = true
        }
    }

    func cheapFix(inner: UIColor, outter: UIColor) {

        let backgroundsetting = RadialGradient()

        backgroundsetting.innerColor = inner
        backgroundsetting.outterColor = outter

        backgroundsetting.frame = (frame: CGRect(x: self.view.frame.size.width * 0, y: self.view.frame.size.height * 0, width:self.view.frame.size.width, height: self.view.frame.size.height))
        self.view.addSubview(backgroundsetting)
        self.view.sendSubview(toBack: backgroundsetting)
        self.reloadInputViews()




    }
    let backgroundsetting = RadialGradient()


    override func viewWillAppear(_ animated: Bool) {
        backgroundsetting.innerColor = UIColor.green
        backgroundsetting.outterColor = UIColor.red

        backgroundsetting.frame = (frame: CGRect(x: self.view.frame.size.width * 0, y: self.view.frame.size.height * 0, width:self.view.frame.size.width, height: self.view.frame.size.height))
        self.view.addSubview(backgroundsetting)
        self.view.sendSubview(toBack: backgroundsetting)
        self.reloadInputViews()

    }


}

我看到两件事。

  1. 您的 cheapFix 方法永远不会更新 backgroundsetting 属性。它创建自己的同名局部变量。所以你实际上是一遍又一遍地添加新视图,但每个视图都被发送到后面,所以你只能看到第一个。这就是为什么一切似乎都没有改变的原因。
  2. None 是必需的。只需创建一个 RadialGradient 视图。当您希望其颜色发生变化时,只需更新其颜色即可。 class 需要修复,以便在更新其属性时重新绘制。

RadialGradient class 中的两个属性进行以下更改:

var innerColor = UIColor.yellow {
    didSet {
        setNeedsDisplay()
    }
}
var outterColor = UIColor.red {
    didSet {
        setNeedsDisplay()
    }
}

这些更改将确保视图在其颜色更新时自行重绘。