2012-02-28 3 views
4

Je dessine du texte dans le code multiplateforme Mac/iOS en utilisant CoreText. J'utilise peut-être des polices qui n'ont pas de version «Italique» réelle installée dans le système d'exploitation pour tous les utilisateurs, mais elles doivent savoir que le texte est en italique même à ce moment-là. Avec NSAttributedString -drawAtPoint de AppKit:, je peux utiliser NSObliquenessAttributeName pour rendre le texte incliné (et donc italique - bien, oblique). CoreText ne semble pas avoir d'équivalent pour cet attribut. Au moins, je n'en ai trouvé aucun dans CTStringAttributes.h (pas de documentation, même des années après la sortie de CoreText).Quel est le CoreText équivalent à NSObliquenessAttributeName de AppKit?

Est-ce que quelqu'un sait comment je peux obtenir un texte oblique avec CoreText sur iOS?

+0

Documentation pour le texte principal? Tu veux dire ça? https://developer.apple.com/library/ios/documentation/Carbon/Reference/CoreText_Framework_Ref/ –

+0

J'ai cliqué sur "Reference" dans le centre de développement Mac, j'ai tapé CoreText dans le champ de recherche, et tout ce que j'ai eu, c'était trois exemples d'applications. Comment avez-vous sorti ces documents secrets? – uliwitness

+0

Il s'agit de la meilleure référence sur https://developer.apple.com/library/mac/search/?q=core+text. –

Répondre

1

L'affichage d'une police qui n'a pas de caractère italique en italique est généralement une mauvaise idée. Cependant, je peux comprendre qu'il y a des cas où cela doit être appliqué de toute façon.

La seule solution qui me vient à l'esprit est en ce moment pour créer une police personnalisée avec une matrice de police cisaillé:

CGAffineTransform matrix = CGAffineTransformMake(1, tan(degreesToRadians(0)), tan(degreesToRadians(20)), 1, 0, 0); 
CTFontRef myfont = CTFontCreateWithName(CFSTR("Helvetica"), 48, &matrix); 

Vous aurez à jouer avec la matrice et voir ce qui apporte les meilleurs résultats. (S'il vous plaît ne pas qu'il s'agit d'un faux mélange de code de ma tête et de l'Internet.)

+1

Je pense que vous voulez une matrice de cisaillement plutôt qu'une matrice de rotation. – alastair

+1

Merci, je vais essayer, avec la correction d'Alastair. Je serais heureux de ne pas avoir à afficher des italiques faux, mais ce sont des données préexistantes qui faisaient cela, et je ne peux pas simplement laisser tomber les informations qui auparavant s'affichaient bien. :-) – uliwitness

+1

Oui, une matrice oblique est ce que vous voulez. –

1

N'a pas essayé, mais selon iOS Programming Pushing The Limits, en passant kCTFontItalicTrait à CTFontCreateCopyWithSymbolicTraits choisira vrai italique si disponible, et oblique autrement. Il y a aussi kCTFontSlantTrait pour une inclinaison décimale manuelle jusqu'à 30 degrés.

+0

Pour autant que je sache, cela ne fonctionne que pour les polices qui comportent une variante en italique. J'ai compris la question comme si l'OP voulait afficher italique avec une police qui n'a pas italique. –

+0

J'ai essayé kCTFontSlantTrait, cela n'a pas aidé (j'ai l'impression que c'est un attribut en lecture seule). Le trait en italique choisit une police oblique dans des cas comme Courier, qui vient en fait avec une variante oblique pré-construite, mais certaines des polices que j'ai besoin d'afficher n'ont même pas cela. – uliwitness

8

Je voudrais essayer d'utiliser l'argument de transformation affine à CTFontCreateWithName() avec une matrice de cisaillement. Par exemple

CGAffineTransform matrix = { 1, 0, 0.5, 1, 0, 0 }; 
CTFontRef myFont = CTFontCreateWithName(CFSTR("Helvetica"), 48, &matrix); 

Cela va créer toute une inclinaison extrême (en supposant que je l'ai eu droit), mais vous voyez l'idée.

Mise à jour:

En fait, the documentation appears to imply that this is the right way to do things.

+0

Bonne réponse mais s'il vous plaît ne jamais me faire avoir à regarder ça. – hooleyhoop

Questions connexes