我的View Controller中有一个步进器,用于更新redd1
中的变量(greenn1
,bluee1
,UIView
)。 drawRect
绘制一个初始圆圈,updateColor
用于在其上绘制一个带有更新颜色的新圆圈。当我调用updateColor
时,变量会更新,我知道它们会被传递,因为当我在updateColor中打印出它们的值时,它们是正确的。 updateColor
赢得了一个新的圈子。
class UIView1: UIView {
var redd1 = 0.0;
var greenn1 = 0.0;
var bluee1 = 0.0;
override init(frame: CGRect)
{
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
}
override func drawRect(rect: CGRect)
{
let circle2 = UIView(frame: CGRect(x: -25.0, y: 10.0, width: 100.0, height:100.0))
circle2.layer.cornerRadius = 50.0
let startingColor2 = UIColor(red: (CGFloat(redd1))/255, green: (CGFloat (greenn1))/255, blue: (CGFloat(bluee1))/255, alpha: 1.0)
circle2.backgroundColor = startingColor2;
addSubview(circle2);
}
func updateColor()
{
let circle = UIView(frame: CGRect(x: -25.0, y: 10.0, width: 100.0, height: 100.0))
circle.layer.cornerRadius = 50.0;
let startingColor = UIColor(red: (CGFloat(redd1))/255, green: (CGFloat(greenn1))/255, blue: (CGFloat(bluee1))/255, alpha: 1.0)
circle.backgroundColor = startingColor;
addSubview(circle);
}
}
答案 0 :(得分:2)
请勿在{{1}}中致电addSubview
。如果您要自己绘制一个圆圈,请仅使用drawRect
(例如,通过调用drawRect
的{{1}})。或者,如果您要将圈子添加为子视图(作为stroke
子图层添加到视图的UIBezierPath
),则完全退出CAShapeLayer
。
但是,通过在layer
中调用drawRect
,您不会改变颜色,而是每次都添加另一个子视图。同样,通过在addSubview
中调用updateColor
,每次操作系统调用addSubview
时,您也会在那里添加另一个子视图。例如,我运行了你的代码,将颜色从黑色变为红色,再变为绿色,再变为蓝色,触发drawRect
再次被调用几次,当我在视图调试器中查看视图层次结构时,您可以在视图层次结构中看到所有视图:
这是一种危险的做法,因为这些子视图会随着时间的推移而累积,占用内存。
如果您要添加子视图,我建议(a)drawRect
不是添加子视图的正确位置; (b)如果您决定采用drawRect
方法,请在添加新的子视图之前决定是否删除之前的子视图。
就个人而言,如果我希望drawRect
绘制不同颜色的圆圈,我只会addSubview
drawRect
。例如:
stroke
顺便提一下,您注意到我们可以完全退出UIBezierPath
。使用上面的代码,如果您设置红色,绿色或蓝色,它将调用class CircleView: UIView {
var redd1: CGFloat = 0.0 {
didSet {
setNeedsDisplay()
}
}
var greenn1 : CGFloat = 0.0 {
didSet {
setNeedsDisplay()
}
}
var bluee1: CGFloat = 0.0 {
didSet {
setNeedsDisplay()
}
}
override func drawRect(rect: CGRect) {
let color = UIColor(red: redd1 / 255.0, green: greenn1 / 255.0, blue: bluee1 / 255.0, alpha: 1.0)
color.setStroke()
let path = UIBezierPath(arcCenter: CGPoint(x: 75, y: 75), radius: 50, startAngle: 0, endAngle: CGFloat(M_PI * 2.0), clockwise: true)
path.lineWidth = 2
path.lineCapStyle = .Round
path.stroke()
}
}
,这将触发自动重绘的视图。
您报告上述内容尚无效。好吧,我用这段代码试了一下:
updateColor
它运作良好:
答案 1 :(得分:0)
正如你所提到的,两者都有他们应该具有的价值。 您绘制的两个圆圈完全位于相同的位置,并且根据您的代码段,两者都具有完全相同的颜色。他们应该如何区别?当然,当它们具有相同的颜色和相同的位置时,您无法看到两个圆圈。它们被叠加了。