2016-03-24 6 views
0

私が作成した棒グラフに軸のテキストを追加しようとしています。それを行うにはNSViewのグラフサブクラスの中にosxをスクロールしてテキストフィールドをプログラムで作成します。

は、私はこのコードを使用:

func showLabel (value: String, point: CGPoint) -> NSTextField { 
    let label = NSTextField(frame: NSMakeRect(point.x, point.y, 100, 100)) 
    label.stringValue = "Axis Value" 
    label.textColor = NSColor.blueColor() 
    return label 
} 

をしかし、それは動作しませんでしたdrawrect{}内でこの関数を呼び出すときに何かが欠けているように、見えます。軸ラベルを表示するにはどうすればよいですか?これは、軸とタイトルを持つ優れた棒グラフのように見えるはずです。

棒グラフはこのように見えますが、列の数は異なる場合があります。

bar chart in the playground

import Cocoa 

class MyView: NSView { 
override func drawRect(rect:NSRect){ 
    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() 

    let bezierPath = NSBezierPath() 

    // Create a rectangle that's inset by 15% on all sides 
    let drawingRect = CGRectInset(self.bounds, self.bounds.size.width * 0.15, 
            self.bounds.size.height * 0.15); 
    // Define the points that make up the drawing 
    let bottomLeft = CGPointMake(CGRectGetMinX(drawingRect), CGRectGetMinY(drawingRect)) 
    let topRight = CGPointMake(CGRectGetMinX(drawingRect), CGRectGetMaxY(drawingRect)) 
    let bottomRight = CGPointMake(CGRectGetMaxX(drawingRect), 
            CGRectGetMinY(drawingRect)) 


    // Start drawing 
    bezierPath.moveToPoint(topRight) 
    bezierPath.lineToPoint(bottomLeft) 
    bezierPath.lineToPoint(bottomRight) 

    // Finish drawing by closing the path 
    //bezierPath.closePath() 

    // Set the colors and draw them 
    //NSColor.redColor().setFill() 
    NSColor.blackColor().setStroke() 
    //bezierPath.fill() 
    bezierPath.stroke() 

    // Bars 
    let bezierPathBarres = NSBezierPath() 


    // m'haure d'inventar algo per fer aixo 
    var arrayY = [100, 200, 300, 200, 100, 200, 300, 0, 35, 100, 200, 30] 
    var arrayX = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 

    for i in 0..<0 { 
     arrayY.append(30+i) 
    } 
    //let arrayX = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 


    // entorn de X per barres 
    let numeroDeBarres: CGFloat = CGFloat(arrayY.count) 

    let espaiEntreBarres:CGFloat = 0.2 // estaria be fer-ho inspectable 
    let ampladaEixX = self.bounds.width * (1 - 0.30) 
    let espaiOcupatDelEixPerEspaisEntreBarres = ampladaEixX * espaiEntreBarres 
    let espaiOcupatDelEixPerBarres = ampladaEixX * (1 - espaiEntreBarres) 

    let espaiUnaBarra = espaiOcupatDelEixPerBarres/numeroDeBarres 
    let espaiUnaSeparacio = espaiOcupatDelEixPerEspaisEntreBarres/(numeroDeBarres + 1) 

    //entorn de Y per barres 
    let valorBarraMax: CGFloat = CGFloat(arrayY.maxElement()!) 
    let alçadaEixY = self.bounds.size.height * (1 - 0.30) 
    let alçadaBarraMax = alçadaEixY * 0.90 

    //creem un array d'alçades 
    var arrayAlçades: [CGFloat] = [] 
    for i in 0..<arrayY.count { 
     let valorBarra = CGFloat(arrayY[i]) 
     arrayAlçades.append(alçadaBarraMax * valorBarra/valorBarraMax) 
    } 


    for i in 0..<arrayY.count { 

     // Define the points that make up the drawing 
     //let bottomEspaiPunt = CGPointMake(CGRectGetMinX(drawingRect), CGRectGetMinY(drawingRect)) 
     //let bottomBarraPuntEsquerra = CGPointMake(CGRectGetMinX(drawingRect)+(espaiUnaSeparacio + espaiUnaBarra) * CGFloat(i) + espaiUnaSeparacio, CGRectGetMinY(drawingRect)) 
     //let topBarraPuntEsquerra = CGPointMake(CGRectGetMinX(drawingRect)+(espaiUnaSeparacio + espaiUnaBarra) * CGFloat(i) + espaiUnaSeparacio, CGRectGetMinY(drawingRect) + arrayAlçades[i]) 
     //let topBarraPuntDreta = CGPointMake(CGRectGetMinX(drawingRect)+(espaiUnaSeparacio + espaiUnaBarra) * CGFloat(i) + espaiUnaBarra, CGRectGetMinY(drawingRect) + arrayAlçades[i]) 
     //let bottomBarraPuntDreta = CGPointMake(CGRectGetMinX(drawingRect)+(espaiUnaSeparacio + espaiUnaBarra) * CGFloat(i) + espaiUnaBarra, CGRectGetMinY(drawingRect)) 

     let rect = CGRect(x: CGRectGetMinX(drawingRect)+(espaiUnaSeparacio + espaiUnaBarra) * CGFloat(i) + espaiUnaSeparacio, y: CGRectGetMinY(drawingRect), width: espaiUnaBarra, height: arrayAlçades[i]) 

     let path = NSBezierPath(rect:rect) 
     bezierPathBarres.appendBezierPath(path) 
     // Start drawing 
     //bezierPathBarres.moveToPoint(bottomBarraPuntEsquerra) 
     //bezierPathBarres.lineToPoint(topBarraPuntEsquerra) 
     //bezierPathBarres.lineToPoint(topBarraPuntDreta) 
     //bezierPathBarres.lineToPoint(bottomBarraPuntDreta) 

     // Adding 
     let text = showLabel(String(arrayX[i]), point: CGPointMake(CGRectGetMinX(drawingRect)+(espaiUnaSeparacio + espaiUnaBarra) * CGFloat(i) + espaiUnaSeparacio + espaiUnaBarra/2 , CGRectGetMinY(drawingRect) - 0.15/2 * self.bounds.size.height)) 
     self.addSubview(text) 

     // Finish drawing by closing the path 
     //bezierPathBarres.closePath() 
    } 

    // Set the colors and draw them 
    NSColor.greenColor().setFill() 
    NSColor.blackColor().setStroke() 
    bezierPathBarres.fill() 

    if arrayY.count<20 { 
     bezierPathBarres.stroke() 
    } 

} 


func showLabel (valor: String, point: CGPoint) -> NSTextField { 
    let label = NSTextField(frame: NSMakeRect(point.x, point.y, 100, 100)) 
    label.stringValue = "2" 
    label.textColor = NSColor.blueColor() 
    return label 
} 

// radiate the bbox out until the hashmarks are further out than the bounds 

} 

let viewRect = NSRect(x: 0, y: 0, width: 150, height: 100) 
let myEmptyView = MyView(frame: viewRect) 
+1

スーパービューにサブビューとして追加しましたか? –

+0

@RomanSausarnes私は自分の質問にコードを追加しました。私はクラスMyView内の関数を呼び出します:NSView {override func drawRect(rect:NSRect){}} –

+0

あなたは正しいです!私はこれについて心配していたことに気付かなかった。ありがとう@RomanSausarnes –

答えて

2

あなたはそれが含まれていますビューのサブビューとしてラベルを追加する必要があります。

let label = showLabel(...) 
self.addSubview(label) 

ことを試してみて、それが動作するかどうかを確認。ところで、このコードをdrawRectに入れてはいけません。ビューが再描画されるたびに新しいラベルが追加されます。

+0

はい!私はただそれを見る!ありがとう、私もそれを投稿するつもりだった!そして、私はそれを何回もやり直すことができますか? –

+0

イニシャライザの1つを無効にしてそこにラベルを追加するか、おそらく 'awakeFromNib'を上書きすることができます。 –

関連する問題