Caratteri personalizzati in iOS 7


102

Sto sviluppando un gioco e vorrei utilizzare un carattere personalizzato nella mia app. Sto usando SpriteKit per questo, se è importante. Ho provato a utilizzare questo https://github.com/deni2s/IBCustomFonts ma non riesco a farlo funzionare con questo carattere http://www.fontspace.com/freaky-fonts/emulogic

Ho provato varie cose e ho registrato il carattere nella info.plist dell'app ... Qualcuno sa cosa sta succedendo?


Sei sicuro di utilizzare il nome corretto per il carattere quando lo usi nel tuo codice?
Nick

1
questo blog potrebbe esserti
Xu Yin

Risposte:


277

Prima di tutto presumo che SpriteKit non faccia alcuna differenza.

  1. Hai bisogno del tuo font in .otf o .ttf copiato nel tuo progetto. Ad esempio in Supporting Files.
  2. Devi modificare il file .plist . Aggiungi la chiave "Caratteri forniti dall'applicazione" nel tuo plist e nell'elemento 0 copia il nome esatto del file del carattere che hai copiato nell'estensione dei file di supporto WITH. Ad esempio: "JosefinSansStd-Light_0.otf"
  3. Assicurati che il carattere che hai importato nella tua app sia stato impacchettato nell'app stessa. Fallo selezionando il tuo target , quindi Build Phases , quindi Copy Bundle Resources . Se non vedi il tuo carattere lì dentro, trascinalo da File di supporto .

Infine, vorresti elencare tutti i tuoi caratteri quando l'app si avvia solo per vedere il nome utilizzabile per il tuo carattere. Lo farai con questo piccolo pezzo di codice:

NSArray *fontFamilies = [UIFont familyNames];
for (int i = 0; i < [fontFamilies count]; i++)
{
    NSString *fontFamily = [fontFamilies objectAtIndex:i];
    NSArray *fontNames = [UIFont fontNamesForFamilyName:[fontFamilies objectAtIndex:i]];
    NSLog (@"%@: %@", fontFamily, fontNames);
}

Cerca il tuo font nei risultati stampati, ad esempio, cercherò "Josefin" e vedrei che il nome del font effettivo è "JosefinSansStd-Light". Dopodiché devi usare quel carattere solo per:

UIFont *customFont = [UIFont fontWithName:@"JosefinSansStd-Light" size:20];

In iOS8 aggiungi i tuoi caratteri direttamente al progetto e sono visibili nel generatore di interfacce. Modifica il tuo codice per tenerne conto ma impostando a livello di codice il carattere per iOS7 e selezionandolo nel generatore di interfacce xCode6. PS. Il generatore di interfacce in xCode6 ti fornisce il nome del font corretto che puoi copiare e incollare nel codice sottostante.

#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

 if(SYSTEM_VERSION_LESS_THAN(@"8.0"))
    {
        UIFont *customFont = [UIFont fontWithName:@"OpenSans-Light" size:32];
        self.registerLabel.font = customFont;  
    }

Spero che questo aiuti, applausi.


Grazie! Capito! Il problema era che non volevo aggiungerlo a Supporting Files, quindi non veniva caricato: P
José María

1
Ho dovuto usare la chiave plist diUIAppFonts
Mike Flynn

1
Ho ricreato la mia app, l'intero progetto da iOS7 / Xcode 5.1.1 in un progetto iOS8 / Xcode 6.0. Il carattere personalizzato non veniva visualizzato finché non ho eseguito il secondo passaggio. Spiegazione Gr8!
MB_iOSDeveloper

1
Lo stesso codice per ottenere i nomi dei caratteri in Swift: let fontFamilies = UIFont.familyNames() for familyName in fontFamilies { let fontNames = UIFont.fontNamesForFamilyName(familyName as String) println("\(familyName): \(fontNames)") }
Alexander Bekert

1
Qualche codice swift per stampare tutti i nomi dei font:for name in UIFont.familyNames() { debugPrint(UIFont.fontNamesForFamilyName(name)) }
gimenete

24

Nessun problema nell'usare caratteri personalizzati, l'ho fatto. Segui questi passi:

  1. Registra il carattere nel tuo info.plist aggiungendo la voce "Caratteri forniti dall'applicazione". Inserisci il nome del file del carattere, non il nome del carattere. Come font.ttf (penso che tu l'abbia già fatto)
  2. Vai al tuo progetto nel navigatore del progetto, fai clic sul nome del progetto e vai su "fasi di costruzione" quindi guarda in basso in "Copia risorse bundle" vai in fondo, ci sono molti file e cerca il segno "+". Si aprirà una finestra popup con i file del progetto. Cerca il tuo file di font e aggiungilo al pacchetto.
  3. Infine controlla il nome del carattere. Quando lo usi nel codice, devi usare il nome del carattere, non il nome del file. Per conoscere il nome del carattere, fai doppio clic sul file del carattere nel Finder e si aprirà una finestra che mostra il carattere. Controlla il titolo della finestra, è il nome del carattere che devi usare.

E consiglio, aggiungi quel nome come macro nel tuo file ..Prefix.pch. Sarà più facile usarlo nel tuo progetto se devi usare il carattere più volte.

Il problema che penso tu abbia avuto è che hai registrato correttamente il carattere ma non è stato copiato nel bundle dell'app. Quindi, quando l'app è stata eseguita, non è stato possibile trovare il carattere. Ecco perché il passaggio 2 è importante. Ho passato molto tempo a cercare di capirlo la prima volta :)


2
La chiave per me era il titolo del carattere. Grazie!
Oscar

20

Per raggiungere questo obiettivo in modo rapido

Se desideri elencare tutti i tuoi caratteri all'avvio dell'app, solo per vedere il nome utilizzabile per il tuo carattere. Puoi farlo con questo piccolo pezzo di codice:

    UIFont.familyNames.forEach {
        print("fontFamily: \($0), fonts: \(UIFont.fontNames(forFamilyName: $0))")
    }

o conUIFont.familyNames.forEach { print("fontFamily: \($0), fonts: \(UIFont.fontNames(forFamilyName: $0))") }
Daniel

5

Non sono mai riuscito a far funzionare queste risposte dopo aver provato più volte. L'unico modo in cui ho mai inserito un carattere personalizzato per seguire le istruzioni nella risposta accettata, quindi creare un'etichetta nascosta nello storyboard che utilizza il carattere. Posso usare il carattere in modo programmatico. Strano e hacky lo so, ma ha funzionato per me.


1
hai esattamente ragione. Ho esaminato tutto in molti tutorial, incluso il plist, il segno di spunta per il progetto di destinazione, le fasi di costruzione e infine ho trovato il nome della famiglia di caratteri corretto, ma non funzionava ancora. Poi ho aggiunto un'etichetta nascosta come dici tu e alla fine è apparsa. Sto usando Xcode 7.2 e deve essere un bug.
DrZ214

3

Se sei in Xcode 6 è facile come sembra. Basta aggiungere una fontcartella al tuo progetto, aggiungere i tuoi caratteri nella cartella e sei a posto.

inserisci qui la descrizione dell'immagine


7
Assicurati di aggiungerlo anche al target previsto. Il subdolo hobbit Xcode.
Matt Parkins

3

Se nessuno dei metodi sopra ha funzionato per te E ti capita di usare il tuo carattere personalizzato solo "programmaticamente" (cioè non l'hai usato in nessun xib) allora dovrai usarlo almeno una volta da qualche parte in un xib, ovunque .

(PS Stuart Clark - ha già risposto, quindi nessun merito per me, per favore. Tuttavia, ho deciso di riformularlo e pubblicarlo come risposta separata, perché mi mancava la sua risposta, non mi era chiaro quando l'ho letto. Ho trovato questa soluzione per caso quando stavo testando il carattere personalizzato in un xib, e ho visto che funzionava altrove a livello di programmazione, ma quando ho rimosso il carattere da xib, ha smesso di funzionare a livello di programmazione.)


2

Aggiornato per Swift 3.

let fontFamilies:[String] = UIFont.familyNames

for fontFamily: String in fontFamilies {
    let fontNames: [String] = UIFont.fontNames(forFamilyName: fontFamily)
    print("\(fontFamily)  \(fontNames)");
}

0

Forse una soluzione rapida: questo lo ha fatto per me quando il carattere ha già funzionato, ma una nuova etichetta ad es. Non mostrava il carattere desiderato:

cartella dei dati derivati ​​pulita, pulita in profondità e vuota.


0
please try below code.
@end
@implementation UILabel (CustomFont)
-(void)setFontName:(NSString *)value{
CGFloat newsize = (self.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self setFont:[UIFont fontWithName:self.font.fontName size:newsize]];
}
@end
@implementation UITextField (CustomFont)
-(void)setFontName:(NSString *)value{
CGFloat newsize = (self.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self setFont:[UIFont fontWithName:self.font.fontName size:newsize]];
}
@end
@implementation UIButton (CustomFont)
-(void)setFontName:(NSString *)value{
CGFloat newsize = (self.titleLabel.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self.titleLabel setFont:[UIFont fontWithName:self.titleLabel.font.fontName size:newsize]];
}
@end
@end

@interface UILabel (CustomFont)
-(void)setFontName:(NSString *)value;
@end
@interface UITextField (CustomFont)
-(void)setFontName:(NSString *)value;
@end
@interface UIButton (CustomFont)
-(void)setFontName:(NSString *)value;
@end
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.