Swift 调用 setNeedsDisplay 时的奇怪行为
Swift weird behavior when setNeedsDisplay is called
我正在制作一个模拟引擎油门的应用程序。当我滑动 UISlider 时,我希望 RPM 量表指针增加并更新 RPM 量表中的 UILabel。除了一个奇怪的部分外,我的所有东西都在工作:UILabel 中的文本会覆盖自身(即,它会自行覆盖自身,以便所有值相互叠加并且不可读)。这是我 ViewController:
中的滑块代码
@IBAction func changeThrottleSetting(sender: UISlider)
{
compactEngineView.RPMPointerAngleInt = Int(sender.value)
compactEngineView.setNeedsDisplay()
}
然后在 compactEngineView 本身:
var RPMPointerAngleInt = Int()
var RPMPointerAngle: CGFloat { //this angle is used to draw the pointer points later down in the code, didn't show it here just to keep it shorter
var AngleCGFloat = CGFloat(RPMPointerAngleInt)
var Pi = CGFloat(M_PI)
var CorrectedAngle = (9 * Pi / 800) * AngleCGFloat - (Pi/2) //just some math to make it look right on the display
return CorrectedAngle
}
var RPMPercentageValue: Int {
var correctedValue = (0.55) * Float(RPMPointerAngleInt) + 55
return Int(correctedValue)
}
override func drawRect(rect: CGRect)
{
let RPMPointerPath = UIBezierPath()
RPMPointerPath.moveToPoint(RPMPointer1)
RPMPointerPath.addLineToPoint(RPMPointer2)
RPMPointerPath.addLineToPoint(RPMPointer3)
RPMPointerPath.addLineToPoint(RPMPointer1)
whiteColor.set()
RPMPointerPath.stroke()
RPMPointerPath.fill()
//here is the troublemaker
let RPMdisplaylabel = UILabel(frame: CGRectMake(0, 0, 81, 32))
RPMdisplaylabel.center = RPMdisplayLocation
RPMdisplaylabel.textAlignment = NSTextAlignment.Right
RPMdisplaylabel.text = "\(RPMPercentageValue)%"
RPMdisplaylabel.textColor = UIColor.whiteColor()
RPMdisplaylabel.font = UIFont(name: "HelveticaNeue",
size: 27.0)
self.addSubview(RPMdisplaylabel)
}
指针完美运行。没什么好抱怨的。但是每次我移动滑块时,文本都会自行绘制。 DrawRect 部分中的 UILabels 是否有单独的技巧?谢谢!
//here is the troublemaker
let RPMdisplaylabel = UILabel(frame: CGRectMake(0, 0, 81, 32))
RPMdisplaylabel.center = RPMdisplayLocation
RPMdisplaylabel.textAlignment = NSTextAlignment.Right
RPMdisplaylabel.text = "\(RPMPercentageValue)%"
RPMdisplaylabel.textColor = UIColor.whiteColor()
RPMdisplaylabel.font = UIFont(name: "HelveticaNeue",
size: 27.0)
self.addSubview(RPMdisplaylabel)
您正在做一些您永远不应该做的事情:在 drawRect:
中,您正在做的不仅仅是在矩形内绘图! drawRect:
的工作是绘制矩形内的内容,不多也不少。 不是添加子视图的地方!您已经发现了原因之一:由于 drawRect:
在应用程序的生命周期中可以被调用数千次,因此您最终将添加数千个相同的子视图。
所以这里发生的是你正在创建和添加一个 UILabel,一次又一次,一次又一次......所以你最终得到了无数的 UILabel,它们都在同一个位置,因此彼此重叠并给出您正确描述的结果。
解决方案:在别处添加一次标签。不要为此滥用 drawRect:
。
我正在制作一个模拟引擎油门的应用程序。当我滑动 UISlider 时,我希望 RPM 量表指针增加并更新 RPM 量表中的 UILabel。除了一个奇怪的部分外,我的所有东西都在工作:UILabel 中的文本会覆盖自身(即,它会自行覆盖自身,以便所有值相互叠加并且不可读)。这是我 ViewController:
中的滑块代码@IBAction func changeThrottleSetting(sender: UISlider)
{
compactEngineView.RPMPointerAngleInt = Int(sender.value)
compactEngineView.setNeedsDisplay()
}
然后在 compactEngineView 本身:
var RPMPointerAngleInt = Int()
var RPMPointerAngle: CGFloat { //this angle is used to draw the pointer points later down in the code, didn't show it here just to keep it shorter
var AngleCGFloat = CGFloat(RPMPointerAngleInt)
var Pi = CGFloat(M_PI)
var CorrectedAngle = (9 * Pi / 800) * AngleCGFloat - (Pi/2) //just some math to make it look right on the display
return CorrectedAngle
}
var RPMPercentageValue: Int {
var correctedValue = (0.55) * Float(RPMPointerAngleInt) + 55
return Int(correctedValue)
}
override func drawRect(rect: CGRect)
{
let RPMPointerPath = UIBezierPath()
RPMPointerPath.moveToPoint(RPMPointer1)
RPMPointerPath.addLineToPoint(RPMPointer2)
RPMPointerPath.addLineToPoint(RPMPointer3)
RPMPointerPath.addLineToPoint(RPMPointer1)
whiteColor.set()
RPMPointerPath.stroke()
RPMPointerPath.fill()
//here is the troublemaker
let RPMdisplaylabel = UILabel(frame: CGRectMake(0, 0, 81, 32))
RPMdisplaylabel.center = RPMdisplayLocation
RPMdisplaylabel.textAlignment = NSTextAlignment.Right
RPMdisplaylabel.text = "\(RPMPercentageValue)%"
RPMdisplaylabel.textColor = UIColor.whiteColor()
RPMdisplaylabel.font = UIFont(name: "HelveticaNeue",
size: 27.0)
self.addSubview(RPMdisplaylabel)
}
指针完美运行。没什么好抱怨的。但是每次我移动滑块时,文本都会自行绘制。 DrawRect 部分中的 UILabels 是否有单独的技巧?谢谢!
//here is the troublemaker
let RPMdisplaylabel = UILabel(frame: CGRectMake(0, 0, 81, 32))
RPMdisplaylabel.center = RPMdisplayLocation
RPMdisplaylabel.textAlignment = NSTextAlignment.Right
RPMdisplaylabel.text = "\(RPMPercentageValue)%"
RPMdisplaylabel.textColor = UIColor.whiteColor()
RPMdisplaylabel.font = UIFont(name: "HelveticaNeue",
size: 27.0)
self.addSubview(RPMdisplaylabel)
您正在做一些您永远不应该做的事情:在 drawRect:
中,您正在做的不仅仅是在矩形内绘图! drawRect:
的工作是绘制矩形内的内容,不多也不少。 不是添加子视图的地方!您已经发现了原因之一:由于 drawRect:
在应用程序的生命周期中可以被调用数千次,因此您最终将添加数千个相同的子视图。
所以这里发生的是你正在创建和添加一个 UILabel,一次又一次,一次又一次......所以你最终得到了无数的 UILabel,它们都在同一个位置,因此彼此重叠并给出您正确描述的结果。
解决方案:在别处添加一次标签。不要为此滥用 drawRect:
。