0

我正在制作一个模拟发动机油门的应用程序。当我滑动 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 有单独的技巧吗?谢谢!

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:,你所做的不仅仅是在矩形内绘图!的工作drawRect:是在矩形内绘制内容,不多也不少。不是添加子视图的地方你已经发现了一个原因:因为drawRect:在应用程序的生命周期中可以被调用数千次,你最终会添加数千个相同的子视图。

所以这里发生的事情是你正在创建和添加一个 UILabel,一次又一次,一次又一次......所以你最终得到了无数的 UILabel,所有这些都在同一个位置,因此相互重叠并给出你正确的结果描述。

解决方案:在其他地方添加一次标签。不要滥用drawRect:这个。

于 2015-04-29T18:59:28.810 回答