2016-12-29 15 views
0

MacOSでSwift 3/Xcode 8を使用しています。SwiftでCGContextにテキストを追加する

Iは、(コード参照)、Iは、単純な図形を描画することができる午前NSViewのにdrawを上書きして、現在のコンテキストを使用して:

クラスサンプル:NSImageView {

override func draw(_ dirtyRect: NSRect) { 
    super.draw(dirtyRect) 
    let context = NSGraphicsContext.current()?.cgContext; 
    let length = CGPoint(x: 100, y: 100) 
    let p1 = CGPoint(x: 200, y: 200) 
    let shape = "square" 


    context!.beginPath() 
    context!.move(to: p1) 

    if shape == "line" { 
     let pointEnd = CGPoint(x: p1.x + length.x, y: p1.y + length.y) 
     context!.addLine(to: pointEnd) 
    } else if shape == "square" { 
     let p2 = CGPoint(x: p1.x + length.x, y: p1.y) 
     let p3 = CGPoint(x: p1.x + length.x, y: p1.y + length.y) 
     let p4 = CGPoint(x: p1.x, y: p1.y + length.y) 
     context!.addLine(to: p2) 
     context!.addLine(to: p3) 
     context!.addLine(to: p4) 
     context!.addLine(to: p1) 
    } 

    context!.setStrokeColor(red: 1, green: 1, blue: 1, alpha: 1.0) 
    context!.setFillColor(red: 0, green: 1, blue: 0, alpha: 1) 
    context!.setLineWidth(2.0) 
    context!.strokePath() 

    let textColor = NSColor(calibratedRed: 1, green: 1, blue: 1, alpha: 1.0) 
    let textColorB = NSColor(calibratedRed: 1, green: 1, blue: 1, alpha: 0.0) 
    let rect = CGRect(x: 200, y: 200, width: 30, height: 130) 
    let paragraphStyle = NSMutableParagraphStyle() 
    paragraphStyle.alignment = .center 
    let attr = [NSParagraphStyleAttributeName: paragraphStyle, NSForegroundColorAttributeName: textColor, NSBackgroundColorAttributeName: textColorB, NSFontAttributeName:NSFont.init(name: "HelveticaNeue-Thin", size: 14)] 

    let q: NSString = "hello, world" 
    let center = CGPoint(x: 0, y: 0) 
    q.draw(at: center, withAttributes: attr)                 
} 

上記を補正しますメソッド全体を表示します。

これは、テキスト描画以外は期待どおりに動作します。私が試した2つのドローは、最後の2つのラインに示されています。最初は次のように示唆され、クラッシュします(その行のコメントのメッセージを参照)。 2番目は近いですが、CGContextではなくNSDrawingContextを要求します。

私はまた、テキストを(線の真下に)描いておきたいと思います。私はたくさんの検索をして、何も見つからない。 CGContextsには描画テキストに関するメソッドがあるようですが、実際に描画するようなものはありません。明らかにするために、私はコンパイルすることはほとんどなく、ずっと少なく走っていました。

注:私はmacOS開発に新しいです(しかし、いくつかのiOSを行っています)。だから私は非常に明白な何かを見逃す可能性があります

属性の色割り当てに問題がありました。 コードで編集しました。

+0

"私はコンパイルう何も見つからなかった" - あなたがトラブルにコンパイルするために何かを得ることを持っている場合** **コードを表示してください。利用できないコードについてはお手伝いできません。 (さらに、「実際に描画していないようだ」とは、コードを実行しても画面上に何も表示されなかったことを暗示しているようです。) – jtbandes

+0

これらのメソッドもチェックしてください:https://developer.apple.com/library/ content/documentation/Cocoa/Conceptual/AttributedStrings/Tasks/DrawingAttrStrings.html – jtbandes

+0

現在の描画コードは実際に 'stroke' /' fill'コールなしで動作しますか? – jtbandes

答えて

1

現在のグラフィックスコンテキストにテキストを描画する簡単な方法は、NSStringのdraw(at:withAttributes:)です。

例:

class MyView : NSView { 
    override func draw(_ dirtyRect: NSRect) { 
     let atts = [NSFontAttributeName:NSFont.init(name: "Georgia", size: 30)] 
     ("Hello world" as NSString).draw(
      at: NSMakePoint(100,100), 
      withAttributes: atts) 
    } 
} 

結果:

enter image description here

+0

思い出してみましたが、どうやってそれがうまくいかないのか覚えていません。おそらく、それをcgContextで動作させることはできませんでした。だから私はもう一度それを試し、あなたに戻ってきます。 –

+0

OKもう一度試しました。それは、 "インスタンスに送信された認識できないセレクタを返す"エラーが発生し、コンテキストを参照していないと思われるエラーで失敗します。しかし、提案をありがとう。 –

+0

私は本当にあなたがすべてのことを意味するか分からない。もちろんそれは動作します。私はいくつかのサンプルコードと実行中のアプリケーションで表示される図面を表示するために私の答えを編集しました。 – matt

関連する問題