2012-02-09 8 views
12

Desidero utilizzare un carattere personalizzato per uno UILabel. Il tipo di carattere personalizzato viene caricato da un file:Come convertire CGFontRef in UIFont?

NSString *fontPath = ... ; // a TTF file in iPhone Documents folder 
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]); 
CGFontRef customFont = CGFontCreateWithDataProvider(fontDataProvider); 
CGDataProviderRelease(fontDataProvider); 

Come posso convertire il CGFontRef ad un UIFont per essere utilizzato in [UILabel setFont:]?

+2

Quale versione iOS è necessario supportare? È possibile caricare i font in bundle come istanze di 'UIFont' modificando Info.plist. – Costique

+1

Non sono sicuro di convertire un CGFontRef in un UIFont ma potresti creare una sottoclasse di UILabel che prende un CGFontRef. Controlla questo [blog] (http://blog.mro.name/2010/08/uilabel-with-a-custom-cgfont/) nel farlo –

+0

@Costique iOS 4.3 o successivo è OK.Il carattere è aggiunto dall'utente dopo aver scaricato l'app, quindi non posso preimpostare Info.plist. – ohho

risposta

15

risposta di Conrad è vicino ma non funziona del tutto. È necessario fornire UIFont con il nome PostScript, anziché il nome completo.

NSString *fontName = (NSString *)CGFontCopyPostScriptName(fontRef); 
UIFont *font = [UIFont fontWithName:fontName size:someSize] 
+0

+1, corretto, dovrebbe usare il nome dello script post altrimenti registrerà fallito. – ZYiOS

+3

Si noti che 'CGFontCopyPostScriptName' alloca e restituisce un' CFStringRef' che si deve successivamente 'CFRelease'. La trasmissione del valore restituito a NSString è una cattiva idea per la leggibilità. –

3

Non sono, in linea di principio, direttamente convertibili. Un motivo semplice è che UIFont incapsula la dimensione del carattere, mentre CGFont è indipendente dalla dimensione (con la dimensione che è una proprietà del contesto grafico, vedi CGContextSetFontSize()).

Supponendo che si è diversamente stabilito dalle dimensioni desiderate per il carattere, si dovrebbe essere in grado di qualcosa di simile a:

NSString *fontName = (NSString *)CGFontCopyFullName(someCGFontRef); 
UIFont *font = [UIFont fontWithName:fontName size:someSize]; 
[fontName release]; 

Non ho effettivamente testato questo, ma dovrebbe funzionare (forse con alcune aggiunte minori) . Credo che ci sia una corrispondenza tra i nomi di CGFont e UIFont - ma se non c'è, questo ovviamente non funzionerà.

2

Puoi convertire il tuo CGFont in CTFont, ma sfortunatamente nessuno di questi ti porterà un UIFont. Ecco i modi per ottenere un UIFont: chiedere un font di sistema o chiedere un font con il suo nome PostScript. Pertanto, per i font personalizzati forniti in una UILabel, ti suggerisco di utilizzare quest'ultima.

Se si conosce il file del font vostra applicazione utilizzerà prima del tempo è possibile aggiungere al tuo pacco e caricarlo con UIFont, + fontWithName: dimensioni: come UIFont ricerche vostro pacco per un file di font con quella Nome PostScript.

Ad esempio, il file di carattere TrueType "VeraMono.ttf" ha il nome PostScript "Bitstream Vera Sans Mono", quindi è caricato in un UILabel come:

label.font = [UIFont fontWithName:@"Bitstream Vera Sans Mono" size:12];

Per ottenere i nomi PostScript non -in modo dinamico, utilizzare uno strumento di carattere, o, nel caso in cui il nome PostScript è uguale alla visualizzazione "Nome completo" da Finder> Ottieni informazioni.

Tuttavia, per i casi in cui non si conosce necessariamente il nome PostScript del font in anticipo (come il supporto dei caratteri definiti dall'utente), è possibile caricare il nome file in NSData e "grep" come nome PostScript. .

Buona fortuna,

+0

Grazie per la spiegazione. La tua risposta, con la risposta di Josh Brown, mi ha aiutato 4 anni dopo! –

15

Non è possibile convertire CGFontRef a UIFont direttamente, ma è possibile registrarsi utilizzando CGFontRefCTFontManagerRegisterGraphicsFont e quindi creare corrispondenti UIFont.

NSString* fpath = [documentsDirectory stringByAppendingPathComponent:@"custom_font_file_name.ttf"]; 
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fpath UTF8String]); 
CGFontRef customFont = CGFontCreateWithDataProvider(fontDataProvider); 
CGDataProviderRelease(fontDataProvider); 
NSString *fontName = (__bridge NSString *)CGFontCopyFullName(customFont); 
CFErrorRef error; 
CTFontManagerRegisterGraphicsFont(customFont, &error); 
CGFontRelease(customFont); 
UIFont* uifont = [UIFont fontWithName:fontName size:12]; 
+0

Ho ricevuto questo errore Impossibile caricare il carattere: impossibile completare l'operazione. (errore com.apple.coretext 105 - Impossibile registrare il CGFont '') – Durgaprasad

+0

documentsDirectory .. "Uso dell'identificatore non dichiarato 'documentsDirectory' ... intendevi? ....?? ? – Morkrom

+2

Errore 105 = carattere già registrato – dulgan