ios fuentes - ¿Puedo incrustar una fuente personalizada en una aplicación de iPhone?




letras instalar (25)

Hay una nueva forma de usar fuentes personalizadas, comenzando con iOS 4.1. Le permite cargar fuentes dinámicamente, ya sea desde archivos incluidos con la aplicación, datos descargados o lo que tenga. También le permite cargar fuentes a medida que las necesita, mientras que el método anterior las carga todas al momento de iniciar la aplicación, lo que puede demorar mucho si tiene muchas fuentes.

El nuevo método se describe en ios-dynamic-font-loading

Utiliza la función CTFontManagerRegisterGraphicsFont , lo que le da un búfer con sus datos de fuente. Luego está disponible para UIFont y las vistas web, al igual que con el método anterior. Aquí está el código de ejemplo de ese enlace:

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

Esta pregunta se refiere a iOS pre-3.2. A partir de 3.2, esta funcionalidad es fácilmente alcanzable utilizando la respuesta de samvermette a continuación, y he cambiado la Respuesta Aceptada (de comando a samvermette) para reflejar esto. No puedo dar crédito a ambas respuestas (además de upvotes) pero ambas son buenas.

Me gustaría que una aplicación incluyera una fuente personalizada para representar texto, cargarla y luego usarla con elementos UIKit estándar como UILabel . es posible?

Encontré abajo los enlaces:

pero esto requeriría que yo renderizase cada glifo, lo cual es un poco como un trabajo duro, especialmente para texto de varias líneas.

También encontré publicaciones que dicen directamente que no es posible, pero sin justificación, así que estoy buscando una respuesta definitiva.

EDITAR - fallado -[UIFont fontWithName:size:] experiment

Descargué Harrowprint.tff (descargado desde here ) y lo agregué a mi directorio de Recursos y al proyecto. Entonces probé este código:

UIFont* font = [UIFont fontWithName:@"Harrowprint" size:20];

que dio lugar a una excepción que se lanza. Mirar el archivo TTF en Finder confirmó que el nombre de la fuente era Harrowprint.

EDITAR : ha habido varias respuestas hasta el momento que me dicen que lea la documentación en X o Y. Experimenté ampliamente con todo esto y no llegué a ninguna parte. En un caso, X resultó ser relevante solo en OS X, no en iPhone. En consecuencia, estoy estableciendo una recompensa por esta pregunta, y otorgaré la recompensa a la primera persona que proporcione una respuesta (utilizando solo API documentadas) que responda con información suficiente para que esto funcione en el dispositivo. Trabajar en el simulador también sería una ventaja.

EDITAR - Parece que la recompensa se otorga automáticamente a la respuesta con el mayor número de votos. Interesante. En realidad, nadie proporcionó una respuesta que resolviera la pregunta tal como se la formuló: la solución que implica la codificación de su propia subclase UILabel no admite el UILabel palabras, que es una característica esencial para mí, aunque creo que podría ampliarla para hacerlo.


Para iOS 3.2 y superior: use los métodos proporcionados por varios de arriba, que son:

  1. Agregue su archivo de fuente (por ejemplo, Chalkduster.ttf ) a la carpeta de Recursos del proyecto en XCode.
  2. Abra info.plist y agregue una nueva clave llamada UIAppFonts. El tipo de esta clave debe ser array.
  3. Agregue su nombre de fuente personalizado a esta matriz, incluida la extensión (" Chalkduster.ttf ").
  4. Use [UIFont fontWithName:@"Real Font Name" size:16] en su aplicación.

PERO el "Nombre de fuente real" no siempre es el que se ve en el Libro de fuentes. La mejor manera es preguntar a su dispositivo qué fuentes ve y cuáles son los nombres exactos.

Uso el uifont-name-grabber publicado en: uifont-name-grabber

Simplemente coloque las fuentes que desee en el proyecto xcode, agregue el nombre del archivo a su lista y ejecútelo en el dispositivo para el que está creando, le enviará una lista completa de fuentes con los nombres que UIFont fontWithName: espera.


Hice todo lo posible, pero las nuevas fuentes no aparecen, así que encontré la solución:

Cuando arrastre los archivos fot (otf o ttf) NO olvide marcar la casilla debajo de "Agregar a objetivos".

Después de hacer eso aparecerá su fuente y todo funcionará bien.


Una mejor solución es agregar una nueva propiedad " Fonts provided by application " a su archivo info.plist .

Luego, puede usar su fuente personalizada como UIFont normal.


He estado probando las diversas sugerencias en esta página en iOS 3.1.2 y estas son mis conclusiones:

El simple uso de [UIFont fontWithName:size:] con las fuentes en el directorio de Recursos no funcionará, incluso si el nombre de FOND se establece usando FontForge.

[UIFont fontWithName:size:] funcionará si las fuentes se cargan primero utilizando GSFontAddFromFile. Pero GSFontAddFromFile no forma parte de iOS 3.1.2, por lo que debe cargarse dinámicamente como lo describe @rpetrich.


Puede agregar los archivos "FONT" requeridos dentro de la carpeta de recursos. Luego vaya al Info.plistarchivo de Proyecto y use la CLAVE "Fuentes proporcionadas por la aplicación" y el valor como "NOMBRE FUENTE".

Entonces puedes llamar al método. [UIFont fontwithName:@"FONT NAME" size:12];


sigue este paso

1) Copia tu fuente en tu proyecto.

2) abra su archivo .plist en modo de código fuente ... (Nota: No abra info.plist )

3) Antes de eso, haga clic con el botón derecho en su fuente y ábrala en fontforge o editor similar, e install en su sistema.

4) Escribe esto

 <key>UIAppFonts</key>
<array>
    <string>MyriadPro.otf</string>
</array>

5) Escriba este código en su class .m

 [lblPoints setFont:[UIFont fontWithName:@"Myriad Pro" size:15.0]];

Aquí lblPoints cambiará a partir de su UILabel

¡¡Hecho!! Si su fuente aún no funciona, verifique primero la compatibilidad de sus fuentes


He combinado algunos de los consejos de esta página en algo que me funciona en iOS 5.

Primero, debe agregar la fuente personalizada a su proyecto. Luego, debe seguir los consejos de @iPhoneDev y agregar la fuente a su archivo info.plist.

Después de hacer eso, esto funciona:

UIFont *yourCustomFont = [UIFont fontWithName:@"YOUR-CUSTOM-FONT-POSTSCRIPT-NAME" size:14.0];
[yourUILabel setFont:yourCustomFont];

Sin embargo, necesita saber el nombre PostScript de su fuente. Solo sigue los consejos de @Daniel Wood y presiona command-i mientras estés en el FontBook.

Entonces, disfruta de tu fuente personalizada.


He hecho esto así:

Cargue la fuente:

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

Ahora, en tu drawRect: haz algo como esto:

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

Básicamente, tienes que hacer algo de fuerza bruta recorriendo el texto e intercambiando información con el número mágico para encontrar tu desplazamiento (aquí, véeme usar 29) en la fuente, pero funciona.

Además, debe asegurarse de que la fuente se pueda incrustar legalmente. La mayoría no lo son y hay abogados que se especializan en este tipo de cosas, así que ten cuidado.


Un aviso importante: debe usar el "nombre PostScript" asociado con la fuente, no su nombre completo o el apellido. Este nombre a menudo puede ser diferente del nombre normal de la fuente.


Primero agregue la fuente en formato .odt a sus recursos, en este caso usaremos DINEngschriftStd.otf, luego usaremos este código para asignar la fuente a la etiqueta

[theUILabel setFont:[UIFont fontWithName:@"DINEngschriftStd" size:21]];

Para asegurarse de que su fuente está cargada en el proyecto solo llame

NSLog(@"Available Font Families: %@", [UIFont familyNames]);

En el .plist debes declarar la fuente. Solo agregue un registro de 'Fuentes proporcionadas por la aplicación' y agregue una cadena de elemento 0 con el nombre de la fuente (DINEngschriftStd.otf)


Buscar ATSApplicationFontsPath

Una entrada simple que le permite incluir el (los) archivo (s) de fuente en su carpeta de recursos de la aplicación y "simplemente funcionan" en su aplicación.


Recomendaría seguir uno de mis tutoriales cortos favoritos aquí: http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/ de donde proviene esta información.

Paso 1: arrastre su .ttf o .otf desde Finder a su proyecto

NOTA: asegúrese de hacer clic en la casilla "Agregar a objetivos" en el objetivo principal de su aplicación

Si olvidó hacer clic para agregarlo a su destino, haga clic en el archivo de fuente en la jerarquía de su proyecto y en el panel lateral derecho, haga clic en el objetivo principal de la aplicación en la sección Membresía objetivo

Para asegurarse de que sus fuentes sean parte del objetivo de su aplicación, asegúrese de que aparezcan en sus recursos de paquete de copias en las fases de compilación

Paso 2 - Agrega los nombres de los archivos de fuentes a tu Plist

Vaya a las Propiedades de destino de iOS personalizadas en su Sección de información y agregue una clave a los elementos de esa sección llamada Fonts provided by application (debería verla como una opción a medida que la escribe y se configurará como una matriz). Haga clic en la pequeña flecha para abrir los elementos de la matriz y escriba los nombres de los archivos .ttf o .otf que agregó para que su aplicación sepa que estos son los archivos de fuentes que desea que estén disponibles.

NOTA - Si su aplicación falla justo después de este paso, verifique su ortografía en los elementos que agrega aquí

Paso 3 - Averigua los nombres de tus fuentes para que puedas llamarlas

Muy a menudo, el nombre de la fuente que ve su aplicación es diferente del que cree que se basa en el nombre de archivo de esa fuente, ponga esto en su código y revise el registro que hace su aplicación para ver qué nombre de fuente llamar en su código

Rápido

for family: String in UIFont.familyNames(){
  print("\(family)")
  for names: String in UIFont.fontNamesForFamilyName(family){
      print("== \(names)")
  }
}

C objetivo

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

Su registro debe verse algo como esto:

Paso 4 - Usa tu nueva fuente personalizada usando el nombre del Paso 3

Rápido

 label.font = UIFont(name: "SourceSansPro-Regular", size: 18)

C objetivo

 label.font = [UIFont fontWithName:@"SourceSansPro-Regular" size:18];

Sí, puedes usar fuentes personalizadas en tu aplicación.

paso a paso siguiendo allí:

  • Agregue sus archivos de fuentes personalizados a su proyecto en archivos de soporte
  • Agregue una clave a su Info.plistarchivo llamado UIAppFonts.
  • Haz de esta clave una matriz
  • Para cada fuente que tenga, ingrese el nombre completo de su archivo de fuente (incluida la extensión) como elementos de la matriz UIAppFonts
  • Guardar Info.plistahora en su aplicación, simplemente puede llamar [UIFont fontWithName:@"your Custom font Name" size:20]para obtener la fuente personalizada para usar con suUILabels

después de aplicar esto si no está obteniendo la fuente correcta, haga doble clic en la fuente personalizada y verá que el nombre de la fuente del lado superior se acerca y copia esta fuente, péguela, aquí [UIFont fontWithName:@" here past your Custom font Name" size:20]espero que obtenga la respuesta correcta


Si está utilizando xcode 4.3 , debe agregar la font a la Build Phase en Copy Bundle Resources , de acuerdo con https://.com/users/1292829/arne en el hilo, Custom Fonts Xcode 4.3 . Esto me funcionó, aquí están los pasos que tomé para que las fuentes personalizadas funcionen en mi aplicación:

  1. Agregue la fuente a su proyecto. Arrastré y solté los archivos OTF (o TTF ) a un nuevo grupo que creé y acepté la opción de xcode de copying the files over to the project folder .
  2. Cree la matriz UIAppFonts con sus fuentes enumeradas como elementos dentro de la matriz. Solo los names , no la extensión (por ejemplo, " GothamBold ", " GothamBold-Italic ").
  3. Haga clic en el project name del project name en la parte superior del Project Navigator en el lado izquierdo de la pantalla.
  4. Haga clic en la pestaña Build Phases que aparece en el área principal de xcode.
  5. Expanda la sección " Copy Bundle Resources " y haga clic en "+" para agregar la fuente.
  6. Seleccione el archivo de fuente en el navegador de archivos que se abre al hacer clic en "+" .
  7. Haga esto para cada fuente que tenga que add to the project .

Tal vez el autor se olvidó de darle a la fuente un nombre de Mac FOND ?

  1. Abra la fuente en FontForge luego vaya a Elemento> Información de fuente
  2. Hay una opción "Mac" donde puede establecer el nombre FOND.
  3. En Archivo> Exportar fuente puede crear un nuevo ttf

También puede probar la opción "Apple" en el diálogo de exportación.

DESCARGO DE RESPONSABILIDAD : ¡No soy un desarrollador de iPhone!


Sí, puedes usar fuentes personalizadas en tu aplicación.

paso a paso siguiendo allí:

Agregue sus archivos de fuentes personalizados a su proyecto en archivos de soporte

Agregue una clave a su archivo Info.plist llamado UIAppFonts.

Haz de esta clave una matriz

Para cada fuente que tenga, ingrese el nombre completo de su archivo de fuente (incluida la extensión) como elementos de la matriz UIAppFonts

Guardar Info.plist Ahora en su aplicación, simplemente puede llamar a [UIFont fontWithName: @ "su Nombre de fuente personalizado" tamaño: 20] para obtener la fuente personalizada para usar con sus UILabels después de aplicar esto si no está obteniendo la fuente correcta, luego haga doble clic en la fuente personalizada, y vea cuidadosamente el nombre de la fuente en la parte superior superior y copie esta fuente, pegue, aquí [UIFont fontWithName: @ "aquí pasado su nombre de fuente personalizado" tamaño: 20]

espero que obtengas la respuesta correcta


Con iOS 8 + y Xcode 6 + puedes hacer esto fácilmente. Aquí están los pasos:

1) Arrastre y suelte su fuente en la carpeta de Archivos de Soporte de Xcode . No olvides marcar tu aplicación en la sección Agregar a objetivos . A partir de este momento, puede utilizar esta fuente en IB y elegirla de la paleta de fuentes.

2) Para que esta fuente esté disponible en su dispositivo, abra su info.plist y agregue las Fonts provided by application clave de la Fonts provided by application . Contendrá la clave del Artículo 0, debe agregar su nombre de fuente como valor. El nombre de la fuente puede variar de su nombre de archivo de fuente. Pero primero, intente agregar su nombre de archivo en la mayoría de los casos este trabajo.

Si no, este artículo siempre me ayudó.

Aquí hay un fragmento rápido del código de este artículo para ayudarlo a encontrar el nombre de la fuente.

func allFonts(){

   for family in UIFont.familyNames(){

       println(family)


       for name in UIFont.fontNamesForFamilyName(family.description)
       {
           println("  \(name)")
       }

   }

}

EDITAR

Quiero mencionar que necesita agregar archivos de fuentes a las fases de construcción de su destino , copiar los recursos del paquete . Sin él, no verás tu fuente en el dispositivo. Y podría llevar a un comportamiento inesperado.

Por ejemplo, me encuentro con un bug , cuando UITextField tiene una fuente personalizada, pero esta fuente no estaba en los recursos del paquete de copia . Y cuando paso al viewcontroller con este campo de textfield , hay un retraso de unos 4 segundos antes de que se viewDidLoad función viewDidLoad . La resolución de problemas de fuentes eliminó este retraso. Por lo tanto, recomiendo revisarlo dos veces. (rdar: // 20028250) Por cierto, no pude reproducir el error, pero estoy seguro de que el problema estaba en la fuente.


iOS 3.2 y posteriores soportan esto. Directamente de lo que hay de nuevo en iPhone OS 3.2 doc:

Soporte de fuente personalizado
Las aplicaciones que desean usar fuentes personalizadas ahora pueden incluir esas fuentes en su paquete de aplicaciones y registrarlas con el sistema al incluir la clave UIAppFonts en su archivo Info.plist. El valor de esta clave es una matriz de cadenas que identifica los archivos de fuente en el paquete de la aplicación. Cuando el sistema ve la clave, carga las fuentes especificadas y las pone a disposición de la aplicación.

Una vez que las fuentes se hayan configurado en la Info.plist , puede usar sus fuentes personalizadas como cualquier otra fuente en IB o programáticamente.

Hay un hilo en curso en los foros de desarrolladores de Apple:
https://devforums.apple.com/thread/37824 (es necesario iniciar sesión)

Y aquí hay un excelente y sencillo tutorial de 3 pasos sobre cómo lograr esto (se quitó el enlace roto)

  1. Agregue sus archivos de fuentes personalizados a su proyecto usando Xcode como recurso
  2. Agregue una clave a su archivo UIAppFonts llamado UIAppFonts .
  3. Haz de esta clave una matriz
  4. Para cada fuente que tenga, ingrese el nombre completo de su archivo de fuente (incluida la extensión) como elementos de la matriz UIAppFonts
  5. Guardar Info.plist
  6. Ahora en su aplicación, simplemente puede llamar a [UIFont fontWithName:@"CustomFontName" size:12] para obtener la fuente personalizada para usar con sus UILabels y UITextViews , etc.

También: asegúrese de que las fuentes estén en sus recursos de paquete de copia.


Hay una forma sencilla de usar fuentes personalizadas en iOS 4 .

  1. Agregue su archivo de fuente (por ejemplo, Chalkduster.ttf ) a la carpeta de Recursos del proyecto en XCode.
  2. Abra info.plist y agregue una nueva clave llamada UIAppFonts . El tipo de esta clave debe ser array.
  3. Agregue su nombre de fuente personalizado a esta matriz, incluida la extensión ( Chalkduster.ttf ).
  4. Ahora puede usar [UIFont fontWithName:@"Chalkduster" size:16] en su aplicación.

Desafortunadamente, IB no permite inicializar etiquetas con fuentes personalizadas. Vea esta pregunta para resolver este problema. Mi solución favorita es usar la subclase UILabel personalizada:

@implementation CustomFontLabel

- (id)initWithCoder:(NSCoder *)decoder
{
    if (self = [super initWithCoder: decoder])
    {
        [self setFont: [UIFont fontWithName: @"Chalkduster" size: self.font.pointSize]];
    }
    return self;
}

@end

Es muy fácil agregar una nueva fuente en su aplicación iOS existente.

Solo necesita agregar la fuente, por ejemplo, font.ttf en su Carpeta de recursos.

Abra su aplicación info.plist . Agregue una nueva fila como "Fuentes proporcionadas por la aplicación" y escriba el nombre de la fuente como font.ttf.

Y cuando configure la fuente, haga como setFont:"corresponding Font Name"

Puede verificar si su fuente está agregada o no por NSArray *check = [UIFont familyNames]; .

Devuelve toda la fuente que tu aplicación soporta.


Aún no está disponible, pero la próxima versión de cocos2d (framework de juegos 2d) admitirá fuentes de mapa de bits de longitud variable como mapas de caracteres.

http://code.google.com/p/cocos2d-iphone/issues/detail?id=317

El autor no tiene una fecha de publicación fija para esta versión, pero sí vi una publicación que indicaba que sería en el próximo mes o dos.


Edición: a partir de iOS 3.2, esta funcionalidad está incorporada. Si necesita compatibilidad con versiones anteriores a la 3.2, aún puede utilizar esta solución.

UILabel un módulo simple que extiende UILabel y maneja la carga de archivos .ttf. Lo publiqué en OpenSource bajo la licencia de Apache y lo puse en github Here.

Los archivos importantes son FontLabel.h y FontLabel.m .

Utiliza parte del código de la respuesta de Genericrich .

Busque la fuente Here.

O

  • Copia tu archivo de fuente en recursos

  • Agregue una clave a su archivo Info.plist llamado UIAppFonts. ("Fuentes proporcionadas por la aplicación)

  • Haz de esta clave una matriz

  • Para cada fuente que tenga, ingrese el nombre completo de su archivo de fuente (incluida la extensión) como elementos de la matriz UIAppFonts

  • Guardar Info.plist

  • Ahora, en su aplicación, puede simplemente llamar a [UIFont fontWithName:@"CustomFontName" size:15] para obtener la fuente personalizada para usar con sus UILabels y UITextViews , etc.

Para más información


Encuentra el TTF en el buscador y "Obtener información". Bajo el encabezado "Nombre completo:" me dio un nombre que luego usé con fontWithName (simplemente copié y pegué el nombre exacto, en este caso no fue necesaria la extensión '.ttf').


También puede consultar este thread para establecer fuentes personalizadas para todas las vistas en su actividad.





ios cocoa-touch fonts