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

时间:2016-03-27 17:52:21

标签: swift macos label drawrect

我正在尝试显示条形图视图,但每次包含它的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)

    }
}

1 个答案:

答案 0 :(得分:0)

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

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.
    }
}

我希望它可以帮助别人!