2016-12-29 4 views
0

J'utilise Swift 3/Xcode 8 sur macOS.Ajout de texte à un CGContext avec Swift

I passer outre draw dans un NSView et, en utilisant le contexte actuel, je suis en mesure de dessiner des formes simples (voir code):

échantillon de classe: 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)                 
} 

ci-dessus est corrigée pour montrer toute la méthode.

Ceci fonctionne comme prévu sauf pour le tirage de texte. Deux tirages que j'ai essayé sont montrés dans les 2 dernières lignes. Le premier est comme suggéré ci-dessous et il se bloque (voir le message dans le commentaire pour cette ligne). Le second est proche mais il nécessite un NSDrawingContext, pas un CGContext.

Je voudrais aussi dessiner du texte (disons juste en dessous de la ligne). J'ai fait beaucoup de recherche et n'ai rien trouvé qui fonctionne. CGContexts semble avoir des méthodes liées au dessin de texte mais aucune ne semble le dessiner. Pour être clair, je n'ai rien trouvé qui puisse compiler, encore moins courir.

Note: Je suis novice dans le développement de macOS (j'ai fait un peu d'iOS). Donc, je pourrais manquer quelque chose de très évident.

Le problème résidait dans l'attribution des couleurs dans les attributs. Édité avec du code qui fonctionne maintenant.

+0

"Je ne trouve rien qui compilerait" - ** S'il vous plaît montrer le code ** si vous rencontrez des difficultés pour obtenir quelque chose à compiler. Nous ne pouvons pas vous aider avec du code qui n'est pas disponible. (En outre, "aucun ne semble vraiment dessiner" semble impliquer que vous avez réussi à exécuter le code, mais rien vu à l'écran.) – jtbandes

+0

Consultez également ces méthodes: https://developer.apple.com/library/ content/documentation/Cocoa/Conceptual/AttributedStrings/Tâches/DrawingAttrStrings.html – jtbandes

+0

Et votre code de dessin actuel fonctionne-t-il vraiment sans un appel 'stroke' /' fill'? – jtbandes

Répondre

1

La méthode la plus simple pour dessiner du texte dans le contexte graphique actuel est avec draw(at:withAttributes:) de NSString.

Exemple:

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

Résultat:

enter image description here

+0

J'ai essayé cela en m'en souvenant, mais franchement, je ne me rappelle pas comment cela n'a pas fonctionné pour moi. Peut-être qu'il n'était pas possible de le faire fonctionner avec cgContext. Je vais donc essayer encore et revenir à vous. –

+0

OK, je l'ai essayé à nouveau. Il échoue avec une erreur "donne le sélecteur non reconnu envoyé à l'instance" que je soupçonne de ne pas faire référence au contexte. Merci pour la suggestion, cependant. –

+0

Je ne sais vraiment pas ce que vous voulez dire par là. Bien sûr cela fonctionne. J'ai modifié ma réponse pour montrer un exemple de code et le dessin visible dans l'application en cours d'exécution. – matt