Fuentes personalizadas en iOS 7


102

Estoy desarrollando un juego y me gustaría usar una fuente personalizada en mi aplicación. Estoy usando SpriteKit para eso, si eso es importante. Intenté usar este https://github.com/deni2s/IBCustomFonts pero no puedo hacer que funcione con esta fuente http://www.fontspace.com/freaky-fonts/emulogic

He intentado varias cosas y he registrado la fuente en el info.plist de la aplicación ... ¿Alguien sabe qué está pasando?


¿Está seguro de que está usando el nombre correcto para la fuente cuando la usa en su código?
Nick

1
este blog puede ser útil para usted codewithchris.com/…
Xu Yin

Respuestas:


277

En primer lugar, supongo que SpriteKit no hace ninguna diferencia.

  1. Necesita su fuente en .otf o .ttf copiada a su proyecto. Por ejemplo, en Supporting Files.
  2. Necesita editar el archivo .plist . Agregue la clave "Fuentes proporcionadas por la aplicación" en su plist y en el Elemento 0 copie el nombre de archivo exacto de la fuente que copió en sus archivos de soporte CON extensión. Por ejemplo: "JosefinSansStd-Light_0.otf"
  3. Asegúrese de que la fuente que importó a su aplicación esté empaquetada en la propia aplicación. Haga eso seleccionando su Objetivo , luego Construir Fases , luego Copiar Recursos del Paquete . Si no ve su fuente allí, arrástrela desde Archivos de soporte .

Finalmente, le gustaría enumerar todas sus fuentes cuando la aplicación se inicie solo para ver el nombre utilizable de su fuente. Lo harás con este pequeño fragmento de código:

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);
}

Busque su fuente en los resultados impresos, por ejemplo, buscaría "Josefin" y vería que el nombre real de la fuente es "JosefinSansStd-Light". Después de eso, solo necesita usar esa fuente mediante:

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

En iOS8, agrega sus fuentes directamente al proyecto y son visibles en el generador de interfaces. Modifique su código para tener en cuenta esto, pero estableciendo la fuente mediante programación para iOS7 y seleccionándola en el generador de interfaz xCode6. PD. El generador de interfaces en xCode6 le proporciona el nombre de fuente correcto que puede copiar y pegar en el código siguiente.

#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;  
    }

Espero que esto ayude, salud.


¡Gracias! ¡Lo tengo! El problema era que no quería agregarlo a los archivos de soporte, por lo que no se cargaba: P
José María

1
Tuve que usar la clave plist deUIAppFonts
Mike Flynn

1
Recreé mi aplicación, todo el proyecto de iOS7 / Xcode 5.1.1 en un proyecto de iOS8 / Xcode 6.0. La fuente personalizada no se mostraba hasta que hice el paso 2. ¡Explicación Gr8!
MB_iOSDeveloper

1
El mismo código para obtener nombres de fuentes en Swift: let fontFamilies = UIFont.familyNames() for familyName in fontFamilies { let fontNames = UIFont.fontNamesForFamilyName(familyName as String) println("\(familyName): \(fontNames)") }
Alexander Bekert

1
Algún código rápido para imprimir todos los nombres de fuentes:for name in UIFont.familyNames() { debugPrint(UIFont.fontNamesForFamilyName(name)) }
gimenete

24

No hay problema para usar fuentes personalizadas, lo hice. Sigue estos pasos:

  1. Registre la fuente en su info.plist agregando la entrada "Fuentes proporcionadas por la aplicación". Ponga el nombre del archivo de la fuente, no el nombre de la fuente. Como font.ttf (creo que ya lo hiciste)
  2. Vaya a su proyecto en el navegador de proyectos, haga clic en el nombre del proyecto y vaya a "fases de construcción", luego busque en "Copiar recursos del paquete", vaya al final, hay muchos archivos y busque el signo "+". Se abrirá una ventana emergente con los archivos de su proyecto. Busque su archivo de fuente y agréguelo al paquete.
  3. Finalmente verifique el nombre de la fuente. Cuando lo usa en su código, debe usar el nombre de la fuente, no el nombre del archivo. Para conocer el nombre de la fuente, haga doble clic en el archivo de fuente en el Finder y se abrirá una ventana que muestra la fuente. Verifique el título de la ventana, ese es el nombre de la fuente que debe usar.

Y consejo, agregue ese nombre como una macro en su archivo ..Prefix.pch. Será más fácil usarlo en su proyecto si tiene que usar la fuente varias veces.

El problema que creo que tuvo es que registró correctamente la fuente, pero no se copió en el paquete de la aplicación. Entonces, cuando la aplicación se ejecutó, no pudo encontrar la fuente. Por eso el paso 2 es importante. Pasé mucho tiempo tratando de resolver eso la primera vez :)


2
La clave para mí fue el título de la fuente. ¡Gracias!
Oscar

20

Para lograr esto en rápido

Si desea enumerar todas sus fuentes cuando la aplicación comience, solo para ver el nombre utilizable para su fuente. Puedes hacerlo con este pequeño fragmento de código:

    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

Nunca he podido hacer que estas respuestas funcionen después de haberlo intentado varias veces. La única forma en que he obtenido una fuente personalizada para seguir las instrucciones en la respuesta aceptada y luego crear una etiqueta oculta en el guión gráfico que usa la fuente. Puedo usar la fuente programáticamente. Extraño y hacky, lo sé, pero funcionó para mí.


1
tienes toda la razón. Miré todo en muchos tutoriales, incluido el plist, la marca de verificación para el objetivo del proyecto, las fases de compilación y finalmente encontré el nombre de familia de fuentes correcto, pero aún así no funcionaba. Luego agregué una etiqueta oculta como dices y finalmente apareció. Estoy usando Xcode 7.2 y debe ser un error.
DrZ214

3

Si estás en Xcode 6, es tan fácil como parece. Simplemente agregue una fontcarpeta a su proyecto, agregue su (s) fuente (s) a la carpeta y estará listo.

ingrese la descripción de la imagen aquí


7
Asegúrese de agregarlo también a su objetivo previsto. El astuto hobbit Xcode.
Matt Parkins

3

Si ninguno de los métodos anteriores funcionó para usted, Y resulta que usa su fuente personalizada solo "programáticamente" (es decir, no la usó en ningún xib), entonces deberá usarla al menos una vez en algún lugar de un xib, en cualquier lugar .

(PD: Stuart Clark: ya respondió esto, así que no me dan crédito, por favor. Sin embargo, decidí reformularlo y publicarlo como una respuesta separada, porque me perdí su respuesta, no me quedó claro cuando lo leí. Encontré descubrí esta solución por casualidad cuando estaba probando la fuente personalizada en un xib, y vi que funcionaba en otro lugar programáticamente, pero cuando eliminé la fuente del xib, dejó de funcionar programáticamente).


2

Actualizado para Swift 3.

let fontFamilies:[String] = UIFont.familyNames

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

0

Tal vez una solución rápida: esto lo hizo por mí cuando la fuente ya funcionó, pero una nueva etiqueta, por ejemplo, no mostró la fuente deseada:

carpeta de datos derivados limpia, profunda y vacía.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.