[英]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部分中是否有UILabel的單獨技巧? 謝謝!
//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:
,您所做的事情不僅僅是在rect內部繪制! drawRect:
的工作是在rect內部繪制內容,而不會更多或更少。 這里不是添加子視圖的地方! 而且您發現了一個原因:自從drawRect:
在應用程序的生命周期內可以被調用數千次之后,您最終將添加數千個相同的子視圖。
因此,這里發生的事情是您一次又一次又一次地創建並添加一個UILabel ...這樣您最終得到數以百萬計的UILabel,它們都位於同一位置,從而彼此重疊,從而得到正確的結果描述。
解決方案:在其他地方添加一次標簽。 不要濫用drawRect:
為此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.