Vorrei che un'app includesse un font personalizzato per il rendering del testo, caricarlo e quindi usarlo con UIKit
elementi standard come UILabel
. È possibile?
Vorrei che un'app includesse un font personalizzato per il rendering del testo, caricarlo e quindi usarlo con UIKit
elementi standard come UILabel
. È possibile?
Risposte:
iOS 3.2 e versioni successive supportano questo. Direttamente dal documento Novità di iPhone OS 3.2 :
Supporto per font personalizzati Le
applicazioni che desiderano utilizzare font personalizzati ora possono includere quei font nel loro pacchetto di applicazioni e registrarli con il sistema includendo la chiave UIAppFonts nel loro file Info.plist. Il valore di questa chiave è un array di stringhe che identificano i file dei caratteri nel bundle dell'applicazione. Quando il sistema vede la chiave, carica i caratteri specificati e li rende disponibili per l'applicazione.
Una volta impostati i caratteri in Info.plist
, è possibile utilizzare i caratteri personalizzati come qualsiasi altro carattere in IB o programmaticamente.
C'è un thread in corso sui forum degli sviluppatori Apple:
https://devforums.apple.com/thread/37824 (è necessario il login)
Ed ecco un eccellente e semplice tutorial in 3 passaggi su come raggiungere questo obiettivo (collegamento interrotto rimosso)
Info.plist
file chiamato UIAppFonts
.UIAppFonts
dell'arrayInfo.plist
[UIFont fontWithName:@"CustomFontName" size:12]
per ottenere il carattere personalizzato da utilizzare con UILabels e UITextViews , ecc ...Inoltre: assicurati che i caratteri siano presenti nelle risorse del pacchetto copia.
Modifica: a partire da iOS 3.2, questa funzionalità è integrata. Se devi supportare pre-3.2, puoi comunque utilizzare questa soluzione.
Ho creato un modulo semplice che estende UILabel
e gestisce il caricamento di file .ttf. L'ho rilasciato opensource con la licenza Apache e l'ho messo su github Here.
I file importanti sono FontLabel.h
e FontLabel.m
.
Utilizza parte del codice dalla risposta di Genericrich .
Sfoglia la fonte qui.
O
Copia il file del font in risorse
Aggiungi una chiave al tuo Info.plist
file chiamato UIAppFonts. ("Caratteri forniti dall'applicazione)
Trasforma questa chiave in un array
Per ogni carattere che hai, inserisci il nome completo del tuo file di caratteri (inclusa l'estensione) come elementi nell'array UIAppFonts
Salva Info.plist
Ora nella tua applicazione puoi semplicemente chiamare [UIFont fontWithName:@"CustomFontName" size:15]
per ottenere il carattere personalizzato da usare con il tuo UILabels
e UITextViews
, ecc ...
Esiste un modo semplice per utilizzare caratteri personalizzati in iOS 4 .
Chalkduster.ttf
) nella cartella Risorse del progetto in XCode.info.plist
e aggiungi una nuova chiave chiamata UIAppFonts
. Il tipo di questa chiave dovrebbe essere array.Chalkduster.ttf
).[UIFont fontWithName:@"Chalkduster" size:16]
nella tua applicazione.Sfortunatamente, IB non consente di inizializzare le etichette con caratteri personalizzati. Vedi questa domanda per risolvere questo problema. La mia soluzione preferita è utilizzare una UILabel
sottoclasse personalizzata :
@implementation CustomFontLabel
- (id)initWithCoder:(NSCoder *)decoder
{
if (self = [super initWithCoder: decoder])
{
[self setFont: [UIFont fontWithName: @"Chalkduster" size: self.font.pointSize]];
}
return self;
}
@end
In Info.plist aggiungi la voce "Caratteri forniti dall'applicazione" e includi i nomi dei caratteri come stringhe:
Fonts provided by application
Item 0 myfontname.ttf
Item 1 myfontname-bold.ttf
...
Quindi controlla per assicurarti che il tuo carattere sia incluso eseguendo:
for (NSString *familyName in [UIFont familyNames]) {
for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {
NSLog(@"%@", fontName);
}
}
Nota che il nome del tuo file ttf potrebbe non essere lo stesso nome che usi quando imposti il carattere per la tua etichetta (puoi usare il codice sopra per ottenere il parametro "fontWithName"):
[label setFont:[UIFont fontWithName:@"MyFontName-Regular" size:18]];
modifica: questa risposta è defunta a partire da iOS3.2; usa UIAppFonts
L'unico modo in cui sono stato in grado di caricare con successo messaggi personalizzati UIFont
è tramite il framework privato GraphicsServices.
Quanto segue caricherà tutti i .ttf
caratteri nel bundle principale dell'applicazione:
BOOL GSFontAddFromFile(const char * path);
NSUInteger loadFonts()
{
NSUInteger newFontCount = 0;
for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
newFontCount += GSFontAddFromFile([fontFile UTF8String]);
return newFontCount;
}
Una volta caricati, i caratteri possono essere utilizzati proprio come i caratteri forniti da Apple:
NSLog(@"Available Font Families: %@", [UIFont familyNames]);
[label setFont:[UIFont fontWithName:@"Consolas" size:20.0f]];
GraphicsServices può anche essere caricato in fase di esecuzione nel caso in cui l'API scompaia in futuro:
#import <dlfcn.h>
NSUInteger loadFonts()
{
NSUInteger newFontCount = 0;
NSBundle *frameworkBundle = [NSBundle bundleWithIdentifier:@"com.apple.GraphicsServices"];
const char *frameworkPath = [[frameworkBundle executablePath] UTF8String];
if (frameworkPath) {
void *graphicsServices = dlopen(frameworkPath, RTLD_NOLOAD | RTLD_LAZY);
if (graphicsServices) {
BOOL (*GSFontAddFromFile)(const char *) = dlsym(graphicsServices, "GSFontAddFromFile");
if (GSFontAddFromFile)
for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
newFontCount += GSFontAddFromFile([fontFile UTF8String]);
}
}
return newFontCount;
}
[NSString sizeWithFont:[UIFont fontWithName:@"customFont" size:14]];
restituisce 0 larghezza e altezza per qualsiasi carattere personalizzato che ho provato.
Con iOS 8
+ e Xcode 6
+ puoi farlo facilmente. Ecco i passaggi:
1) Trascina e rilascia il font nella Xcode
cartella dei file di supporto. Non dimenticare di contrassegnare la tua app nella sezione Aggiungi ai target . Da questo momento è possibile utilizzare questo tipo di carattere IB
e selezionarlo dal pallet dei caratteri.
2) Per rendere disponibile questo carattere nel tuo dispositivo, apri il tuo info.plist
e aggiungi Fonts provided by application
chiave. Conterrà la chiave Item 0, è necessario aggiungere il nome del font come valore. Il nome del carattere può variare dal nome del file del carattere. Ma prima, prova ad aggiungere il tuo nome file nella maggior parte dei casi questo lavoro.
In caso contrario, questo articolo mi ha sempre aiutato.
Ecco un rapido frammento del codice di questo articolo per aiutarti a trovare il nome del tuo carattere.
func allFonts(){
for family in UIFont.familyNames(){
println(family)
for name in UIFont.fontNamesForFamilyName(family.description)
{
println(" \(name)")
}
}
}
Voglio menzionare che è necessario aggiungere file di font alle fasi di costruzione del target , Copia risorse del pacchetto . Senza di essa, non vedrai il tuo carattere sul dispositivo. E potrebbe portare a comportamenti imprevisti.
Ad esempio, ho riscontrato un carattere bug
quando UITextField
ho un carattere personalizzato, ma questo carattere non era nelle risorse del pacchetto Copia . E quando seguo viewcontroller
questo textfield
, c'è un ritardo di circa 4 secondi prima che la viewDidLoad
funzione fosse chiamata. Risolvere i problemi relativi ai font ha rimosso questo ritardo. Quindi, consiglio di controllarlo due volte. (rdar: // 20028250) A proposito, non sono stato in grado di riprodurre il bug, ma sono sicuro che il problema riguardasse il carattere.
L'ho fatto in questo modo:
Carica il carattere:
- (void)loadFont{
// Get the path to our custom font and create a data provider.
NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"mycustomfont" ofType:@"ttf"];
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]);
// Create the font with the data provider, then release the data provider.
customFont = CGFontCreateWithDataProvider(fontDataProvider);
CGDataProviderRelease(fontDataProvider);
}
Ora, nel tuo drawRect:
, fai qualcosa del genere:
-(void)drawRect:(CGRect)rect{
[super drawRect:rect];
// Get the context.
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClearRect(context, rect);
// Set the customFont to be the font used to draw.
CGContextSetFont(context, customFont);
// Set how the context draws the font, what color, how big.
CGContextSetTextDrawingMode(context, kCGTextFillStroke);
CGContextSetFillColorWithColor(context, self.fontColor.CGColor);
UIColor * strokeColor = [UIColor blackColor];
CGContextSetStrokeColorWithColor(context, strokeColor.CGColor);
CGContextSetFontSize(context, 48.0f);
// Create an array of Glyph's the size of text that will be drawn.
CGGlyph textToPrint[[self.theText length]];
// Loop through the entire length of the text.
for (int i = 0; i < [self.theText length]; ++i) {
// Store each letter in a Glyph and subtract the MagicNumber to get appropriate value.
textToPrint[i] = [[self.theText uppercaseString] characterAtIndex:i] + 3 - 32;
}
CGAffineTransform textTransform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
CGContextSetTextMatrix(context, textTransform);
CGContextShowGlyphsAtPoint(context, 20, 50, textToPrint, [self.theText length]);
}
Fondamentalmente devi fare un po 'di forza bruta in loop attraverso il testo e andare in giro con il numero magico per trovare il tuo offset (qui, vedimi usando 29) nel carattere, ma funziona.
Inoltre, devi assicurarti che il carattere sia legalmente integrabile. Molti non lo sono e ci sono avvocati specializzati in questo genere di cose, quindi state attenti.
CGContextShowTextAtPoint()
, anche se non funziona con UTF-8.
Sì, puoi includere caratteri personalizzati. Fare riferimento alla documentazione su UIFont, in particolare, il fontWithName:size:
metodo.
1) Assicurati di includere il carattere nella cartella delle risorse.
2) Il "nome" del carattere non è necessariamente il nome del file.
3) Assicurati di avere il diritto legale di usare quel carattere. Includendolo nella tua app, lo stai anche distribuendo e devi avere il diritto di farlo.
Se si utilizza xcode 4.3
, si deve aggiungere il font
al Build Phase
secondo Copy Bundle Resources
, in base alla https://stackoverflow.com/users/1292829/arne nel thread, Personalizzato Font Xcode 4.3 . Questo ha funzionato per me, ecco i passaggi che ho fatto affinché i caratteri personalizzati funzionassero nella mia app:
OTF
(o TTF
) in un nuovo gruppo da me creato e accettato la scelta di xcode copying the files over to the project folder
.UIAppFonts
array con i tuoi caratteri elencati come elementi all'interno dell'array. Solo l' names
estensione, non l'estensione (ad esempio " GothamBold
", " GothamBold-Italic
").project name
strada nella parte superiore del Project Navigator
lato sinistro dello schermo.Build Phases
scheda che appare nell'area principale di xcode.Copy Bundle Resources
sezione " " e fai clic su "+"
per aggiungere il carattere."+"
.add to the project
.Ecco le istruzioni passo passo su come farlo. Non sono necessarie librerie aggiuntive o codici speciali.
http://shang-liang.com/blog/custom-fonts-in-ios4/
Il più delle volte il problema riguarda il tipo di carattere e non il metodo. Il modo migliore per farlo è usare un font che sicuramente funzionerà, come la verdana o la geogia. Quindi passare al carattere desiderato. Se non funziona, forse il nome del carattere non è corretto oppure il carattere non è ben formattato.
È molto semplice aggiungere un nuovo carattere sulla tua app iOS esistente.
Devi solo aggiungere il carattere, ad esempio font.ttf nella cartella delle risorse.
Apri la tua applicazione info.plist
. Aggiungi una nuova riga come "Caratteri forniti dall'applicazione" e digita il nome del carattere come font.ttf.
E quando si imposta il carattere, fare come setFont:"corresponding Font Name"
Puoi controllare se il tuo carattere è stato aggiunto o meno NSArray *check = [UIFont familyNames];
.
Restituisce tutto il carattere supportato dall'applicazione.
Consiglio di seguire uno dei miei brevi tutorial preferiti qui: http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/ da cui provengono queste informazioni.
Passaggio 1: trascina il tuo .ttf o .otf dal Finder nel tuo progetto
NOTA: assicurati di fare clic sulla casella "Aggiungi alle destinazioni" sulla destinazione principale dell'applicazione
Se hai dimenticato di fare clic per aggiungerlo al tuo target, fai clic sul file del carattere nella gerarchia del progetto e nel pannello di destra fai clic sul target dell'app principale nella sezione Appartenenza al target
Per assicurarti che i caratteri facciano parte del target dell'app, assicurati che vengano visualizzati nelle risorse del pacchetto Copia in Fasi di generazione
Passaggio 2: aggiungi i nomi dei file dei caratteri al tuo Plist
Vai alle Proprietà target iOS personalizzate nella sezione Informazioni e aggiungi una chiave agli elementi in quella sezione chiamata Fonts provided by application
(dovresti vederlo apparire come un'opzione mentre lo digiti e si configurerà come un array. Fai clic sulla piccola freccia per aprire gli elementi dell'array e digitare i nomi dei file .ttf o .otf che hai aggiunto per far sapere alla tua app che si tratta dei file dei caratteri che desideri siano disponibili
NOTA: se l'app si arresta in modo anomalo subito dopo questo passaggio, controlla l'ortografia degli elementi che aggiungi qui
Passaggio 3: scopri i nomi dei caratteri in modo da poterli chiamare
Molto spesso il nome del font visto dalla tua applicazione è diverso da quello che pensi sia basato sul nome del file per quel font, inseriscilo nel tuo codice e guarda il registro che la tua applicazione fa per vedere quale nome di font chiamare nel tuo codice
veloce
for family: String in UIFont.familyNames(){
print("\(family)")
for names: String in UIFont.fontNamesForFamilyName(family){
print("== \(names)")
}
}
Obiettivo C
for (NSString* family in [UIFont familyNames]){
NSLog(@"%@", family);
for (NSString* name in [UIFont fontNamesForFamilyName: family]){
NSLog(@" %@", name);
}
}
Il tuo registro dovrebbe assomigliare a questo:
Passaggio 4: utilizzare il nuovo carattere personalizzato utilizzando il nome del passaggio 3
veloce
label.font = UIFont(name: "SourceSansPro-Regular", size: 18)
Obiettivo C
label.font = [UIFont fontWithName:@"SourceSansPro-Regular" size:18];
Non è ancora uscito, ma la prossima versione di cocos2d (2d game framework) supporterà i caratteri bitmap a lunghezza variabile come mappe dei caratteri.
http://code.google.com/p/cocos2d-iphone/issues/detail?id=317
L'autore non ha una data di uscita ben definita per questa versione, ma ho visto un post che indicava che sarebbe stato nel prossimo mese o due.
Un avviso importante: è necessario utilizzare il "nome PostScript" associato al carattere, non il nome completo o il nome della famiglia. Questo nome può spesso essere diverso dal normale nome del carattere.
segui questo passaggio
1) Copia il tuo carattere nel tuo progetto
2) apri il tuo .plist
file in modalità codice sorgente ... (Nota: non aprire info.plist
)
3) Prima di ciò: fai clic con il pulsante destro del mouse sul tuo carattere e aprilo in fontforge o in un editor simile e install
nel tuo sistema, dovrebbe essereinstall
4) Digita questo
<key>UIAppFonts</key>
<array>
<string>MyriadPro.otf</string>
</array>
5) Digita questo codice nel tuo class .m
[lblPoints setFont:[UIFont fontWithName:@"Myriad Pro" size:15.0]];
Qui lblPoints cambierà dal tuo UILabel
Fatto!! Se il tuo carattere non funziona, controlla prima la compatibilità dei caratteri
info.plist
?
Forse l'autore ha dimenticato di assegnare al font un nome Mac FOND ?
Puoi anche provare l'opzione "Apple" nella finestra di dialogo di esportazione.
NOTA BENE : non sono uno sviluppatore di iPhone!
Ho provato i vari suggerimenti in questa pagina su iOS 3.1.2 e queste sono le mie conclusioni:
Il semplice utilizzo [UIFont fontWithName:size:]
con i caratteri nella directory Risorse non funzionerà, anche se il nome FOND è impostato utilizzando FontForge.
[UIFont fontWithName:size:]
funzionerà se i caratteri vengono caricati per primi utilizzando GSFontAddFromFile. Ma GSFontAddFromFile
non fa parte di iOS 3.1.2, quindi deve essere caricato in modo dinamico come descritto da @rpetrich.
Consultare ATSApplicationFontsPath
Una semplice voce di plist che ti consente di includere i file dei font nella cartella delle risorse dell'app e "funzionano" nella tua app.
Ho combinato alcuni dei consigli di questa pagina in qualcosa che funziona per me su iOS 5.
Innanzitutto, devi aggiungere il carattere personalizzato al tuo progetto. Quindi, è necessario seguire i consigli di @iPhoneDev e aggiungere il carattere al file info.plist.
Dopo averlo fatto, questo funziona:
UIFont *yourCustomFont = [UIFont fontWithName:@"YOUR-CUSTOM-FONT-POSTSCRIPT-NAME" size:14.0];
[yourUILabel setFont:yourCustomFont];
Tuttavia, devi conoscere il nome Postscript del tuo carattere. Segui i consigli di @Daniel Wood e premi command-i mentre sei in FontBook.
Quindi, goditi il tuo carattere personalizzato.
Per prima cosa aggiungi il carattere in formato .odt alle tue risorse, in questo caso useremo DINEngschriftStd.otf, quindi useremo questo codice per assegnare il carattere all'etichetta
[theUILabel setFont:[UIFont fontWithName:@"DINEngschriftStd" size:21]];
Per assicurarti che il tuo carattere sia caricato sul progetto, chiama
NSLog(@"Available Font Families: %@", [UIFont familyNames]);
Nella .plist devi dichiarare il carattere. Basta aggiungere un record "Caratteri forniti dall'applicazione" e aggiungere una stringa elemento 0 con il nome del carattere (DINEngschriftStd.otf)
Per iOS 3.2 e versioni successive: utilizzare i metodi forniti da più sopra, che sono:
[UIFont fontWithName:@"Real Font Name" size:16]
nella propria applicazione.MA il "Nome carattere reale" non è sempre quello che vedi nel Fontbook. Il modo migliore è chiedere al dispositivo quali caratteri vede e quali sono i nomi esatti.
Uso l'Uifont-name-grabber pubblicato su: uifont-name-grabber
Rilascia i caratteri desiderati nel progetto xcode, aggiungi il nome del file al suo plist ed eseguilo sul dispositivo per il quale stai costruendo, ti invierà per email un elenco completo di caratteri usando i nomi che ti UIFont fontWithName:
aspetti.
C'è un nuovo modo di usare caratteri personalizzati, a partire da iOS 4.1. Ti consente di caricare i caratteri in modo dinamico, che si tratti di file inclusi con l'app, dei dati scaricati o di quello che hai. Ti consente anche di caricare i caratteri quando ne hai bisogno, mentre il vecchio metodo li carica tutti al momento dell'avvio dell'app, che può richiedere troppo tempo se hai molti caratteri.
Il nuovo metodo è descritto a ios-dynamic-font-loading
Si utilizza la CTFontManagerRegisterGraphicsFont
funzione, assegnandole un buffer con i dati del font. È quindi disponibile per UIFont
e visualizzazioni Web, proprio come con il vecchio metodo. Ecco il codice di esempio da quel link:
NSData *inData = /* your font-file data */;
CFErrorRef error;
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)inData);
CGFontRef font = CGFontCreateWithDataProvider(provider);
if (! CTFontManagerRegisterGraphicsFont(font, &error)) {
CFStringRef errorDescription = CFErrorCopyDescription(error)
NSLog(@"Failed to load font: %@", errorDescription);
CFRelease(errorDescription);
}
CFRelease(font);
CFRelease(provider);
kCTFontManagerErrorAlreadyRegistered
"Il file è già stato registrato nell'ambito specificato". developer.apple.com/library/ios/#documentation/Carbon/Reference/…
Aggiungi i caratteri richiesti al tuo progetto (proprio come l'aggiunta di immagini, trascina semplicemente su Xcode), assicurati che siano mirati al tuo progetto,
aggiungi questo metodo e carica caratteri personalizzati (consigliato in appDelegate didFinishLaunchingWithOptions
)
func loadFont(filePath: String) {
let fontData = NSData(contentsOfFile: filePath)!
let dataProvider = CGDataProviderCreateWithCFData(fontData)
let cgFont = CGFontCreateWithDataProvider(dataProvider)!
var error: Unmanaged<CFError>?
if !CTFontManagerRegisterGraphicsFont(cgFont, &error) {
let errorDescription: CFStringRef = CFErrorCopyDescription(error!.takeUnretainedValue())
print("Unable to load font: %@", errorDescription, terminator: "")
}
}
Usa esempio:
if let fontPath = NSBundle.mainBundle().pathForResource("My-Font", ofType: "ttf"){
loadFont(fontPath)
}
Usa il carattere:
UIFont(name: "My-Font", size: 16.5)
Ho reso tutto possibile ma i nuovi caratteri non vengono visualizzati, quindi ho trovato la soluzione:
Quando si trascinano i file fot (otf o ttf) NON dimenticare di selezionare la casella di controllo in "Aggiungi ai target".
Dopo aver fatto ciò apparirà il tuo carattere e tutto funzionerà bene.
Sebbene alcune delle risposte sopra siano corrette, ho scritto un tutorial visivo dettagliato per le persone che hanno ancora problemi con i caratteri.
Le soluzioni sopra le quali ti dicono di aggiungere il carattere al plist e usarlo
[self.labelOutlet setFont:[UIFont fontWithName:@"Sathu" size:10]];
sono quelli corretti. Si prega di utilizzare ora qualsiasi altro modo di hacking. Se hai ancora problemi con la ricerca dei nomi dei font e l'aggiunta di questi, ecco il tutorial -
Sì, puoi usare caratteri personalizzati nella tua applicazione
passo dopo passo lì:
Aggiungi i tuoi file di font personalizzati al tuo progetto in file di supporto
Aggiungi una chiave al tuo file Info.plist chiamato UIAppFonts.
Trasforma questa chiave in un array
Per ogni carattere che hai, inserisci il nome completo del tuo file di caratteri (inclusa l'estensione) come elementi nell'array UIAppFonts
Salva Info.plist Ora nella tua applicazione puoi semplicemente chiamare [UIFont fontWithName: @ "dimensione del tuo nome carattere personalizzato": 20] per ottenere il carattere personalizzato da utilizzare con i tuoi UILabels dopo averlo applicato se non ottieni il carattere corretto, quindi fai doppio clic sul carattere personalizzato e osserva attentamente il nome del carattere lato superiore in arrivo e copia questo carattere, incolla, qui [UIFont fontWithName: @ "qui oltre il nome del tuo carattere personalizzato" dimensione: 20]
spero che otterrai una risposta corretta
Sì, puoi usare caratteri personalizzati nella tua applicazione
passo dopo passo lì:
Info.plist
file chiamato UIAppFonts.Info.plist
ora nella tua applicazione puoi semplicemente chiamare [UIFont fontWithName:@"your Custom font Name" size:20]
per ottenere il carattere personalizzato da usare con il tuoUILabels
dopo aver applicato questo se non ottieni il carattere corretto, fai doppio clic sul carattere personalizzato e vedi attentamente il nome del carattere lato superiore sta arrivando e copia questo carattere, incolla, qui [UIFont fontWithName:@" here past your Custom font Name" size:20]
spero che otterrai la risposta corretta