如何调整或删除标签以使 NSView 重绘成为可能?

How can I resize or delete a label to make possible the redraw of the NSView?

我正在尝试显示条形图视图,但每次包含它的 NSView 调整大小时,标签都不会被删除或调整大小并显示类似的内容:bar chart 我使用带边框的标签来制作很容易看出。我说的标签是横轴上的标签。

问题是我在 NSView 子类中的 override func drawRect(rect:NSRect){} 上添加了标签。我把标签放在那里是因为当视图调整大小时标签会跟随条形图并更改其大小并且效果很好,但是创建新标签而不是重新绘制它。 我该如何解决这个问题?

我在 override func drawRect(rect:NSRect){} 中有一个 for 循环调用此函数 12 次:

var label = NSTextField()
private func showLabel (valor: String, frame: CGRect) -> NSTextField      {
    label = NSTextField(frame: frame)
    label.stringValue = valor
    label.textColor = NSColor.blueColor()
    label.editable = false
    label.bordered = true
    label.alignment = .Center
    let fontSize = label.font!.pointSize;

    label.font = NSFont(name: "Arial", size: fontSize)
    return label
}

这里是drawRect方法

override func drawRect(rect:NSRect){
    removeLabel()
    let pathRect = NSInsetRect(self.bounds, 1, 1)
    let path = NSBezierPath(rect: pathRect)

    path.lineWidth = 1
    NSColor.whiteColor().setFill()
    NSColor.blackColor().setStroke()
    path.fill()
    path.stroke()

    eixosDrawing()

    // Bars
    barresDrawing()

    // Eixos
    eixosHoritzontals()

}

以及调用标签函数的函数

// Creating the Labels

func eixosHoritzontals () {

    let drawingRect = elDrawRect()
    let arrayY = dataSource?.infoGraficsView(self) ?? [1,2,3,4,5,6,7,8,9,10,11,12]
    let arrayX = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
    let (espaiUnaBarra, espaiUnaSeparacio) = propBarres (CGFloat(arrayY.count))

    for i in 0..<arrayY.count {

        let posicioX = CGRectGetMinX(drawingRect) + (espaiUnaSeparacio + espaiUnaBarra) * CGFloat(i) + espaiUnaSeparacio + espaiUnaBarra / 2
        let posicioY = CGRectGetMinY(drawingRect) - (self.bounds.size.height * 0.15) / 4
        let centre = CGPoint( x: posicioX, y: posicioY )
        let size = CGSize(width: espaiUnaBarra + espaiUnaSeparacio * 3/2, height: self.bounds.height * 0.15 / 4 )
        let rectu = CGRect(center: centre, size: size)

        // Adding
        let text = showLabel(String(arrayX[i]), frame: rectu)
        self.addSubview(text)

    }
}

我终于用它解决了我的问题:

for subview in self.subviews { // which self is the NSView subclass created by myself
    if subview is NSLabel {
        subview.removeFromSuperview() // delete all the labels added no matter how many of them are there.
    }
}

希望对大家有所帮助!