如何调整或删除标签以重新绘制NSView



我试图显示条形图视图,但每次包含它的NSView调整大小时,标签都不会被删除或调整大小,而是显示类似的内容:条形图我使用了带边框的标签,以便于查看。我所说的标签是横轴上的标签。

问题是,我在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.
    }
}

我希望它能帮助到别人!

最新更新