在我的程序中,我使用滑块更改当前所选颜色的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)
}
答案 0 :(得分:1)
您的应用滞后是因为您在drawRect()
的每次通话中都添加了一个形状图层。因此,层次结构变得越来越大。
您应该只添加一次形状图层,只需更改其颜色和路径。