2016-03-27 1 views
1

Я пытаюсь отобразить представление в виде гистограммы, но каждый раз, когда NSView, который содержит его, меняет размер, метки не удаляются и не изменяются и отображаются примерно так: bar chart Я использовал граничные метки, чтобы упростить их просмотр. Ярлыки, о которых я говорю, это те, которые расположены на горизонтальной оси.Как изменить размер или удалить ярлык, чтобы сделать возможным перерисовку NSView?

Проблема заключается в том, что я добавляю метки на override func drawRect(rect:NSRect){} внутри подкласса NSView. Я помещал эти метки там, потому что, когда представление меняет размеры, эти метки следуют за гистограммой, меняют ее размер и хорошо работают, но создают новые ярлыки, а не перерисовывают их. Как я могу исправить эту проблему?

У меня есть цикл внутри override func drawRect(rect:NSRect){}, что вызывать эту функцию в 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) 

    } 
} 

ответ

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

Надеюсь, это может помочь кому-то!

Смежные вопросы