簡體   English   中英

調用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部分中是否有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM