Rotation d'un texte sous Core Text et sous OSX

Bonjour


CGContextShowTextAtPoint ne fonctionne plus sous 10.11. Je suis donc obligé de découvrir Core Text.


J'ai bien réussi à  trouver des tutoriels et à  afficher du texte mais je bloque sur la rotation. Je souhaite en effet afficher un texte à  80° complètement à  gauche et en bas d'une NSVue. J'ai bien trouvé le moyen de la rotation mais le texte disparait. Et si je change les coordonnées en x, le texte se décale bien mais il monte aussi, ce que je ne veux pas.


 


Quelqu'un peut il m'aider ?


 


Merci d'avance


 


Voici le code



//on dessine le fond
CGContextRef myContext = [[NSGraphicsContext currentContext] graphicsPort];
//dessiner le fond du cadre
CGContextSetRGBFillColor (myContext, 0.3, 0.3, 1, 1);
CGRect rectFond = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
CGContextFillRect (myContext, rectFond);



//==============================================Pour Core Text==========================

CGContextSaveGState(myContext);


CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, self.bounds );

// create a font, quasi systemFontWithSize:24.0
CTFontRef sysUIFont = CTFontCreateUIFontForLanguage(kCTFontSystemFontType,
44.0, NULL);

// create a naked string
NSString *string = @Some Text;

// pack it into attributes dictionary
NSDictionary *attributesDict = [NSDictionary dictionaryWithObjectsAndKeys:
(id)sysUIFont, (id)kCTFontAttributeName,
(id)[NSColor redColor].CGColor , (id)kCTForegroundColorAttributeName,
(id)[NSNumber numberWithInt:kCTUnderlineStyleSingle], (id)kCTUnderlineStyleAttributeName,
(id)[[NSColor yellowColor] CGColor], (NSString *) kCTStrokeColorAttributeName,
(id)[NSNumber numberWithFloat:-5.0], (NSString *)kCTStrokeWidthAttributeName,//epaisseur du contour (-) couleur intérieure dessinée (+) pas de couleur intérieure
nil];

// make the attributed string
NSAttributedString *stringToDraw = [[NSAttributedString alloc] initWithString:string
attributes:attributesDict];

// scale text and flip the coordinate system for ios
CGContextSetTextMatrix(myContext, CGAffineTransformIdentity);
//CGContextTranslateCTM(context, 0, self.bounds.size.height); // pour ios
//CGContextScaleCTM(context, 1.0, -1.0);

CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(M_PI*0.45);
CGContextConcatCTM(myContext, rotationTransform);
//++++ MARCHE AUSSI Mais comment déplacer le texte sur l'axe des x? +++++++

// draw
CTLineRef line = CTLineCreateWithAttributedString((CFAttributedStringRef)stringToDraw);
CGContextSetTextPosition(myContext, 20.0, 0.0);
CTLineDraw(line, myContext);



// clean up
CFRelease(line);
CFRelease(sysUIFont);
[stringToDraw release];

CGContextRestoreGState(myContext);





Réponses

  • Et les méthodes draw* de NSString AppKit Additions tu y as regardé ?


    Tu peux consulter ça à  cette adresse


  • CéroceCéroce Membre, Modérateur
    février 2016 modifié #3
    Bonjour Fred.

    A priori, Core Text utilise de toute façon Core Graphics pour dessiner.
    À mon avis, le problème est que quand on effectue une rotation, cette rotation se fait autour de l'origine. C'est pour ça que ton texte disparait.

    Essaie ça ('centre' est le point autour duquel se fait la rotation):
    - Translate de -centre
    - Effectue la rotation
    - Translate de +centre

    Regarde quand même la doc de Core Text, il y a peut-être un moyen de faire tourner un paragraphe. ça m'étonnerait qu'ils ne l'aient pas prévu.
  • Merci Céroce..toujours de très bonnes idées


     


    En fait, il faut enlever CGContextSetTextPosition(myContext, 100.0, 0.0); et ne travailler que sur CGContextTranslateCTM(myContext, 100, 0);  Ceci étant, il n'y a plus besoin de fonctionner avec le système -centre puis + centre. Le déplacement ne se fait que via CGContextTranslateCTM


     


    Merci encore

Connectez-vous ou Inscrivez-vous pour répondre.