2012-03-19 13 views
9

Ho una sottoclasse personalizzata di UILabel che rende il disegno personalizzato utilizzando CoreText. Ho usato per disegnare le mie stringhe usando lo UIFont impostato sull'etichetta che lo accede usando la proprietà font. Aggiungo anche alcuni tratti al carattere. Ecco come appare:Converti UIFont in CTFontRef e aggiungi corsivo sul display Retina

UIFont* font = [self font]; 
CTFontRef ref = CTFontCreateWithName((CFStringRef)[font name], [font pointSize], NULL); 
CTFontRef italicFont = CTFontCreateCopyWithSymbolicTraits(ref, [font pointSize], NULL, kCTFontItalicTrait, kCTFontItalicTrait); 

Questo funzionava bene fino a quando il nuovo iPad non appariva con il display retina. Quando eseguo la chiamata CTFontCreateCopyWithSymbolicTraits, produce un valore restituito nullo. Ho scoperto che [font name] restituisce ".HelveticaNeueUI" su questi nuovi dispositivi. Lo CTFontCreateWithName sembra funzionare correttamente con questo nome di carattere privato, ma non lo è CTFontCreateCopyWithSymbolicTraits. Tuttavia, se creo un carattere corsivo utilizzando [UIFont italicSystemFontOfSize:[font pointSize]], viene creato un carattere corsivo per il quale [font name] restituisce ancora ".HelveticaNeueUI".

Come devo convertire il mio UIFont in CTFontRef in modo che possa ancora applicare nuovi tratti al mio CTFontRef su entrambi i display retina e non retina?

risposta

13

Un po 'vecchio, ma per chiunque potrebbe ancora preoccupazione:

Questo accade perché il nuovo font Helvetica Neue sistema utilizzato in nuovi dispositivi retina (iPhone 4, iPad) non ha una versione in corsivo. Non tutti i font hanno una variante in grassetto e/o in corsivo.
Quindi, se è necessario il testo in corsivo, è necessario utilizzare un font diverso, ad esempio il vecchio Helvetica.

CTFontRef ref = CTFontCreateWithName((CFStringRef)@"Helvetica", 12, NULL); 
CTFontRef italicFont = CTFontCreateCopyWithSymbolicTraits(ref, 12, NULL, kCTFontItalicTrait, kCTFontItalicTrait); 
+0

E la vostra alternativa è ... – ssteinberg

+0

Ha. Benvenuto in Core Text. –

+0

Voto positivo per il downvote inutile. –

1

Convertire UIFont/NSFont in CTFontRef è molto semplice se si utilizza ARC.

UIFont:

UIFont *uiFont = [UIFont fontWithName:@"Helvetica" size:10]; 
CTFontRef ctFont = (__bridge CTFontRef)uiFont; 

NSFont:

NSFont *nsFont = [NSFont fontWithName:@"Helvetica" size:10]; 
CTFontRef ctFont = (__bridge CTFontRef)nsFont;