0

エンジンのスロットルをシミュレートするアプリを作成しています。UISlider をスライドすると、RPM ゲージ ポインターが増加し、RPM ゲージ内の UILabel が更新されます。1 つの奇妙な部分を除いて、すべてが機能しています。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 の別のトリックはありますか? ありがとう!

4

1 に答える 1

1
//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 内にコンテンツを描画することであり、それ以上でも以下でもありません。サブビューを追加する場所ではありません! そして、その理由の 1 つを発見しdrawRect:ました。アプリの存続期間中に何千回も呼び出される可能性があるため、同じサブビューを何千も追加することになります。

ここで起こっていることは、UILabel を何度も何度も作成して追加しているということです...つまり、膨大な数の UILabels がすべて同じ場所にあるため、互いに重なり合い、正しく結果が得られます。説明された。

解決策: ラベルを別の場所に一度追加します。これを悪用しないでくださいdrawRect:

于 2015-04-29T18:59:28.810 に答える