如何在使用 drawrect() 绘制后删除标签

How to remove labels from after drawing with drawrect()

我对以编程方式绘图还很陌生。我设法绘制了一个折线图,其中包含点、线、自动缩放轴和轴标签。在其他屏幕中,我可以更改图形的特性,当我 return 到屏幕时,我在包含 viewController 的 viewWillAppear 函数中使用 setNeedsDisplay() 刷新它。当我这样做时,线条被完美地重新绘制。

在其他屏幕中添加的新数据可能需要重新缩放坐标轴。问题在于,当重绘图形时,轴上的数字标签只是添加到图形中,并没有删除旧的,这意味着一些标签可能被覆盖,而一些旧的标签只是留在新标签旁边。

我想我明白为什么会发生这种情况,因为我正在创建标签并添加子视图,但没有删除它。我想我认为由于线条被擦除并重新绘制,标签也会如此。如何干净地重新标记我的轴?有一个更好的方法吗?下面列出了我创建标签的功能。此函数由 drawRect()

调用
    func createXAxisLabels(interval: Float, numIntervals: Int)  {
    let xstart: CGFloat = marginLeft
    let yval: CGFloat = marginTop + graphHeight + 10  // 10 pts below the x-axis
    var xLabelVals : [Float] = [0]  
    var xLabelLocs : [CGFloat] = []  // gives the locations for each label

    for i in 0...numIntervals {
        xLabelLocs.append(xstart + CGFloat(i) * graphWidth/CGFloat(numIntervals))
        xLabelVals.append(Float(i) * interval)
    }

    if interval >= 60.0 {
        xUnits = "Minutes"
        xUnitDivider = 60
    }

    for i in 0...numIntervals {
        let label = UILabel(frame: CGRectMake(0, 0, 50.0, 16.0))
        label.center = CGPoint(x: xLabelLocs[i], y: yval)
        label.textAlignment = NSTextAlignment.Center
        if interval < 1.0 {
            label.text = "\(Float(i) * interval)"
        } else {
            label.text = "\(i * Int(interval/xUnitDivider))"
        }
        label.font = UIFont.systemFontOfSize(14)
        label.textColor = graphStructureColor
        self.addSubview(label)
    }
}

drawRect 应该只是绘制矩形,而不是更改视图层次结构。可以反复调用。那些其他标签是其他视图并自己绘制。

你有几个选择

  1. 不要使用标签 -- 而只是将文本绘制到矩形上。

-或-

  1. Add/remove 视图控制器中的标签。

编辑(来自评论):OP 提供了他们的解决方案

I just replaced my code inside the for loop with:

let str : NSString = "\(xLabelVals[i])" 
let paraAttrib = NSMutableParagraphStyle() 
paraAttrib.alignment = NSTextAlignment.Center 
let attributes = [
   NSFontAttributeName: UIFont.systemFontOfSize(14), 
   NSForegroundColorAttributeName: UIColor.whiteColor(), 
   NSParagraphStyleAttributeName: paraAttrib] 
let xLoc : CGFloat = CGFloat(xLabelLocs[i] - 25) 
let yLoc : CGFloat = yval - 8.0 
str.drawInRect(CGRectMake(xLoc, yLoc, 50, 16), withAttributes: attributes)