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()
}
}
我看到两件事。
- 您的
cheapFix
方法永远不会更新 backgroundsetting
属性。它创建自己的同名局部变量。所以你实际上是一遍又一遍地添加新视图,但每个视图都被发送到后面,所以你只能看到第一个。这就是为什么一切似乎都没有改变的原因。
- None 是必需的。只需创建一个
RadialGradient
视图。当您希望其颜色发生变化时,只需更新其颜色即可。 class 需要修复,以便在更新其属性时重新绘制。
对 RadialGradient
class 中的两个属性进行以下更改:
var innerColor = UIColor.yellow {
didSet {
setNeedsDisplay()
}
}
var outterColor = UIColor.red {
didSet {
setNeedsDisplay()
}
}
这些更改将确保视图在其颜色更新时自行重绘。
我正在尝试在我的应用程序中的背景 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()
}
}
我看到两件事。
- 您的
cheapFix
方法永远不会更新backgroundsetting
属性。它创建自己的同名局部变量。所以你实际上是一遍又一遍地添加新视图,但每个视图都被发送到后面,所以你只能看到第一个。这就是为什么一切似乎都没有改变的原因。 - None 是必需的。只需创建一个
RadialGradient
视图。当您希望其颜色发生变化时,只需更新其颜色即可。 class 需要修复,以便在更新其属性时重新绘制。
对 RadialGradient
class 中的两个属性进行以下更改:
var innerColor = UIColor.yellow {
didSet {
setNeedsDisplay()
}
}
var outterColor = UIColor.red {
didSet {
setNeedsDisplay()
}
}
这些更改将确保视图在其颜色更新时自行重绘。