如何正确使用setNeedsDisplay()

时间:2016-10-26 05:27:38

标签: ios swift

在我的程序中,我使用滑块更改当前所选颜色的alpha级别。
当滑块更改其值时,它会调用我的setColor()方法来更新当前颜色新的alpha值并更新显示当前颜色的uiview。
在此功能的内部,我也尝试更新我的自定义uiview,这是powerButton,如下所示。
我改变内环的颜色,然后通过调用setNeedsDisplay()重绘它。我越是滑动并改变颜色,程序开始越来越滞后。

这是因为不断的重绘吗?有一个更好的方法吗?

另外,setNeedsDisplay()是否画了上一张图或者实际更新了吗?

  @IBAction func brightnessSliderChanged(sender: UISlider) {
        let currentVal = Int(sender.value)
        let alpha = CGFloat(Int(currentVal)) * 0.01
        brightnessLabel.text = String(currentVal) + "%"
        setColor(currentColor.colorWithAlphaComponent(alpha))
    }
    func setColor(color: UIColor) {
            let alpha = CGFloat(Int(lightBrightnessSlider.value)) * 0.01
            currentColor = color.colorWithAlphaComponent(alpha)
            colorView.backgroundColor = currentColor
            if powerState {
                powerButton.statusColor = currentColor
                powerButton.setNeedsDisplay()
            }
        }

自定义UIView类和函数是什么样的

@IBDesignable

class PowerButton: UIView {

    @IBInspectable var buttonColor: UIColor = UIColor.whiteColor()
    @IBInspectable var statusColor: UIColor = UIColor.whiteColor()
    let desiredLineWidth:CGFloat = 3

    override func drawRect(rect: CGRect) {
        drawFillCircle()
        drawRing()
        drawInnerCircle()
    }
    internal func drawFillCircle()->() {

        let halfSize:CGFloat = min( bounds.size.width/2, bounds.size.height/2)                

        let circlePath = UIBezierPath(
        arcCenter: CGPoint(x:halfSize,y:halfSize),
        radius: CGFloat( CGFloat(halfSize) - (desiredLineWidth / 2)),
        startAngle: CGFloat(0),
        endAngle:CGFloat(M_PI * 2),
        clockwise: true)

        let shapeLayer = CAShapeLayer()
        shapeLayer.path = circlePath.CGPath

        shapeLayer.fillColor = statusColor.CGColor

        layer.addSublayer(shapeLayer)
    }

Example of the lag that occurs the more I change the color value

1 个答案:

答案 0 :(得分:1)

您的应用滞后是因为您在drawRect()的每次通话中都添加了一个形状图层。因此,层次结构变得越来越大。

您应该只添加一次形状图层,只需更改其颜色和路径。