Swift功能不在更新视图中绘制圆圈

时间:2016-01-30 00:38:15

标签: swift uiview drawing viewcontroller geometry

我的View Controller中有一个步进器,用于更新redd1中的变量(greenn1bluee1UIView)。 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);   
    }   
}

2 个答案:

答案 0 :(得分:2)

请勿在{{1​​}}中致电addSubview。如果您要自己绘制一个圆圈,请仅使用drawRect(例如,通过调用drawRect的{​​{1}})。或者,如果您要将圈子添加为子视图(作为stroke子图层添加到视图的UIBezierPath),则完全退出CAShapeLayer

但是,通过在layer中调用drawRect,您不会改变颜色,而是每次都添加另一个子视图。同样,通过在addSubview中调用updateColor,每次操作系统调用addSubview时,您也会在那里添加另一个子视图。例如,我运行了你的代码,将颜色从黑色变为红色,再变为绿色,再变为蓝色,触发drawRect再次被调用几次,当我在视图调试器中查看视图层次结构时,您可以在视图层次结构中看到所有视图:

enter image description here

这是一种危险的做法,因为这些子视图会随着时间的推移而累积,占用内存。

如果您要添加子视图,我建议(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

它运作良好:

enter image description here

答案 1 :(得分:0)

正如你所提到的,两者都有他们应该具有的价值。 您绘制的两个圆圈完全位于相同的位置,并且根据您的代码段,两者都具有完全相同的颜色。他们应该如何区别?当然,当它们具有相同的颜色和相同的位置时,您无法看到两个圆圈。它们被叠加了。