Adición de fonts personalizadas a la aplicación iOS para encontrar sus nombres reales

Tengo dos fonts para agregar en mi aplicación para usar.

Aquí están las imágenes de fuente. Actualmente los files se nombran como

name.font = [UIFont fontWithName:@"Helvetica Neue LT Pro-Medium" size:10]; headline.font = [UIFont fontWithName:@"Helvetica Neue LT Pro-Light" size:8]; 

poniendo el mismo nombre en la Font Avaliable option in plist file .

También he intentado agregar nombres de file como

 HelveticaNeueLTPro-Lt HelveticaNeueLTPro-Md 

Pero nada parece funcionar. ¿Cómo puedo get el nombre exacto de las fonts?

introduzca la descripción de la imagen aquí

Use +[UIFont familyNames] para enumerar todos los nombres de las familias de fonts conocidas por el sistema. Para cada nombre de familia, puede usar +[UIFont fontNamesForFamilyName:] para enumerar todos los nombres de fonts conocidos en el sistema. Intenta imprimirlos para ver qué nombre espera el sistema. Código de ejemplo:

 static void dumpAllFonts() { for (NSString *familyName in [UIFont familyNames]) { for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) { NSLog(@"%@", fontName); } } } 

Ponga eso en su aplicación, llámelo y vea lo que obtiene. Si ve un nombre en el resultado que parece apropiado para su fuente, úselo. De lo contrario, tal vez no haya agregado correctamente la fuente a su aplicación.

Este es un paso para, Cómo agregar fuente personalizada en la aplicación.

1 – Agregue la fuente .TTF en su aplicación
2 – Modificar el application-info.plist file .
3 – Agregue la key "Fuentes provistas por la aplicación" a una nueva fila
4 – y agregue cada file .TTF (de fuente) a cada línea.

Lea también este y estos tutoriales para mejorar su conocimiento.

PARA MÁS INFORMACIÓN :

Pero después de agregar la fuente a su aplicación, a veces puede ser que el nombre de la fuente no sea el nombre del nombre del file, por lo que necesita aplicar / escribir el nombre real de su fuente, por lo tanto, compruebe la respuesta de @ NSGod .

El siguiente es el código para search todas las fonts del sistema:

 for(NSString *fontfamilyname in [UIFont familyNames]) { NSLog(@"Family:'%@'",fontfamilyname); for(NSString *fontName in [UIFont fontNamesForFamilyName:fontfamilyname]) { NSLog(@"\tfont:'%@'",fontName); } NSLog(@"~~~~~~~~"); } 

Puede estar por encima del paso y la sugerencia es útil en su caso:

Si bien parece que el UIFont fontNamed:size: es bastante indulgente con los nombres que proporciona, el fontName oficial siempre ha sido el nombre PostScript interno de la fuente. El nombre PostScript de una fuente no puede contener espacios y por lo general los reemplaza por un guión. No recuerdo mal, pero creo que también pueden estar limitados a 31 caracteres.

Determinar qué nombre debe usar en el código es extremadamente simple. Haga doble clic en la fuente que desea usar en su dispositivo iOS para abrirla en el Libro de fonts. Si la fuente no está instalada, click el button Instalar en la window de muestra que aparece. Cuando esté instalado, select la fuente en la list de fonts. En el menu del Libro de fonts, elija Vista previa> Mostrar información de fonts. Eso mostrará información sobre la fuente como se muestra en la image a continuación:

introduzca la descripción de la imagen aquí

Como puede ver, el nombre PostScript para Helvetica Neue LT Std 65 Medium es HelveticaNeueLTStd-Md . Ese es el nombre que debes usar en el código.

En su file Info.plist , en las fonts de la aplicación, debe usar el nombre de file real de la fuente, sea lo que sea que suceda. En mi caso, fue HelveticaNeueLTStd-Md.otf .

Forma más fácil de get el nombre de la fuente

  1. Haga clic derecho en su file .ttf / .otf y elija "Obtener información"
  2. Lea la propiedad Full Name y use eso como el nombre de la fuente

Funciona tanto en el file info .plist ( agregando la extensión ) como en el código con [UIFont fontWithName:<Full Name> size:17]

Solo NSLog La fuente que desea get:

NSLog(@" %@", [UIFont fontNamesForFamilyName:@"American Typewriter"]);

Y obtienes la matriz:

 ( "AmericanTypewriter-CondensedLight", "AmericanTypewriter-Light", "AmericanTypewriter-Bold", AmericanTypewriter, "AmericanTypewriter-CondensedBold", "AmericanTypewriter-Condensed" ) 

Use lo que necesite en el Código cualquiera de los nombres de fonts AmericanTypewriter-Bold como [UIFont fontWithName:@"AmericanTypewriter-Bold" size:12.0]

También puede get All Applied Fonts agrupados por Font Family

 for (NSString* family in [UIFont familyNames]) { NSLog(@"%@", family); for (NSString* name in [UIFont fontNamesForFamilyName: family]) { NSLog(@" %@", name); } } 

Escribo un código para imprimir solo el nombre de fuente que desea, no solo imprimir todas las fonts.

 - (NSString *)realNameOfFont:(NSString *)fullFontName { NSString *fontName = [[fullFontName componentsSeparatedByString:@"."] firstObject]; NSString *ext = [fullFontName pathExtension]; NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fontName ofType:ext]]; if (data == nil) { NSLog(@"Failed to load font. Data at path %@ is null", fullFontName); return nil; } CFErrorRef errorRef; CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data); CGFontRef font = CGFontCreateWithDataProvider(provider); NSString *realFontName = (__bridge NSString *)CGFontCopyPostScriptName(font); if (!CTFontManagerRegisterGraphicsFont(font, &errorRef)) { NSError *error = (__bridge NSError *)errorRef; if (error.code != kCTFontManagerErrorAlreadyRegistenetworking) { NSLog(@"Failed to load font: %@", error); } } NSLog(@"Real font name: %@", realFontName); CFRelease(font); CFRelease(provider); return realFontName; } 

Ejemplo:

  NSArray *fonts = @[@"bg_en_AmaticSC-Bold111.otf", @"bg_en_segoescb_0.ttf", @"bg_en_UTM Cookies_2.ttf", @"bg_en_VSCOProximaExtrabold_0.otf"]; for (NSString *fontFullName in fonts) { [self realNameOfFont:fontFullName]; } 

Resultado:

 Failed to load font. Data at path bg_en_AmaticSC-Bold111.otf is null Real font name: SegoeScript-Bold Real font name: UTM-Cookies Real font name: ProximaNova-Extrabld 

No hay nada malo con las otras respuestas. De hecho, los requisitos previos de iPatel continúan aplicándose.

En Swift 2.2+, la llamada para mostrar los nombres de las familias es simplemente:

  UIFont.familyNames().sort().forEach({ (familyName) in debugPrint(UIFont.fontNamesForFamilyName(familyName)) }) 

Si ha instalado las fonts en su sistema, también puede simplemente agregar las fonts a su elemento de interfaz de usuario en el guión gráfico.

Nota

Sin embargo, he notado un error en algunos casos en que después de agregar correctamente las fonts al proyecto, a los elementos info.plist y UI en el guión gráfico, aún no reflejan adecuadamente los cambios deseados. En algunos casos, alternar la configuration ayudará a Sync de Storyboard. Su xml subyacente. En otros casos, quizás deba actualizar simplemente el tamaño de su fuente personalizada en el código para que los cambios surtan efecto. El método más simple en Swift que he encontrado es:

 @IBOutlet weak var startMessage: UILabel! startMessage.font = UIFont(name: startMessage.font.familyName, size: 31.0) 

Lo que supone que la fuente personalizada ya está configurada en el Storyboard y simplemente actualiza el tamaño en el código. Esta solución provisional garantizará que, si se cumplen todos los demás requisitos previos, verá la tipografía personalizada correcta. También elimina la necesidad de conocer realmente el nombre de la fuente subyacente (aunque si lo desea, el código Swift inicial anterior le dará el nombre).

Versión Swift:

 static func printAllFontNames() { for familyname in UIFont.familyNames() { for fname in UIFont.fontNamesForFamilyName(familyname) { print(fname) } } } 

Versión Swift 3:

 UIFont.familyNames.sorted().forEach({ (familyName) in print(UIFont.fontNames(forFamilyName: familyName)) }) 

Actualización para swift 3

 for familyname in UIFont.familyNames { for fname in UIFont.fontNames(forFamilyName: familyname) { print(fname) } }