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

772

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

Airsource Ltd
fuente
55
En una de las conferencias CS193p (iPhone Application Development) en Stanford, Evan señaló que instalar su propia fuente en un dispositivo es "mucho trabajo", lo que al menos significa que es posible :-)
Ilya Birman
2
iPhone 3.2 permite fuentes personalizadas, pero es solo iPad (ver respuesta a continuación)
samvermette
66
Usé imágenes al final.
Airsource Ltd
2
wow ... después de todo eso, la respuesta sigue siendo imágenes ... increíble. Realmente esperaba una implementación sólida de fuentes personalizadas con la misma capacidad que las fuentes del sistema. por desgracia ...
d2burke
1
He recortado sustancialmente la pregunta original para reflejar la década que ha pasado desde que la hice. Animo a todos los demás a recortar sus comentarios y respuestas de manera adecuada.
Airsource Ltd

Respuestas:

646

iOS 3.2 y versiones posteriores lo admiten. Directamente desde el documento Novedades del iPhone OS 3.2 :

Soporte de fuentes personalizadas Las
aplicaciones que desean utilizar fuentes personalizadas ahora pueden incluir esas fuentes en su paquete de aplicaciones y registrar esas fuentes en el sistema al incluir la clave UIAppFonts en su archivo Info.plist. El valor de esta clave es una serie de cadenas que identifican 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 han configurado en el Info.plist, puede usar sus fuentes personalizadas como cualquier otra fuente en IB o programáticamente.

Hay un hilo continuo en los foros de desarrolladores de Apple:
https://devforums.apple.com/thread/37824 (se requiere inicio de sesión)

Y aquí hay un excelente y simple tutorial de 3 pasos sobre cómo lograr esto (enlace roto eliminado)

  1. Agregue sus archivos de fuente personalizados a su proyecto usando Xcode como recurso
  2. Agregue una clave a su Info.plistarchivo llamado UIAppFonts.
  3. Haga 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 UIAppFontsmatriz
  5. Salvar Info.plist
  6. Ahora en su aplicación, simplemente puede llamar [UIFont fontWithName:@"CustomFontName" size:12]para obtener la fuente personalizada para usar con sus UILabels y UITextViews , etc.

Además: asegúrese de que las fuentes estén en los recursos del paquete de copias.

samvermette
fuente
14
Aquí hay un tutorial paso a paso para iOS4: blog.beefyapps.com/2010/06/custom-fonts-in-ios-4
pm_labs
15
Este tutorial es muy bueno. shang-liang.com/blog/custom-fonts-in-ios4 Es importante destacar que el argumento NSString para [UIFont fontWithName: ...] es el nombre del sistema operativo para la fuente en lugar del nombre del archivo.
Willster
152
Antes de que alguien más pase 3 horas instalando fontforge para encontrar el nombre real de la fuente requerida por iOS. Señalaré que simplemente puede presionar Cmd + I en la fuente en el libro de fuentes para encontrar esta información.
Daniel Wood
42
Después de luchar por obtener el nombre de fuente correcto, enumeré las fuentes instaladas y las encontré. Muy útil. Aquí está el código: for (NSString * familyName en [UIFont familyNames]) {NSLog (@ "Family% @", familyName); NSLog (@ "Nombres =% @", [UIFont fontNamesForFamilyName: familyName]); }
Steve Potter
26
Si su código no funciona, asegúrese de que el archivo de fuente aparezca en "Fases de compilación" -> "Copiar recursos del paquete"
Mickey
299

Editar: a partir de iOS 3.2, esta funcionalidad está integrada. Si necesita admitir versiones anteriores a 3.2, aún puede usar esta solución.

Creé un módulo simple que extiende UILabely maneja la carga de archivos .ttf. Lo lancé de código abierto bajo la licencia de Apache y lo puse en github aquí.

Los archivos importantes son FontLabel.hy FontLabel.m.

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

Explore la fuente aquí.

O

  • Copie su archivo de fuente en recursos

  • Agregue una clave a su Info.plistarchivo llamada UIAppFonts. ("Fuentes proporcionadas por la aplicación)

  • Haga 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

  • Salvar Info.plist

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

Para más información

comandante
fuente
2
Intenté usar su código, pero se bloquea con frecuencia dependiendo de la fuente. Por ejemplo, intente usar las fuentes africanas o Tiki desde aquí fontspace.com/category/tiki .
4thSpace
2
Esta biblioteca funciona muy bien. Aunque necesito ayuda con el espacio vertical. No puedo entender cómo hacerlo. Entonces tengo este mensaje.numberOfLines = 3; ¿Cómo controlo el espacio vertical entre la línea 1 y la línea 2 y la línea 3? Gracias, Tee
teepusink
2
@commanda Hola comandante, el enlace que proporcionó en su respuesta parece no estar disponible.
Parth Bhatt
55
@ParthBhatt Debe usar la solución provista en stackoverflow.com/a/2616101/21447 en lugar de FontLabel, ya que ahora esta funcionalidad es proporcionada por CocoaTouch.
comandante
2
@ParthBhatt: No sé por qué el repositorio ya no está alojado en zynga, pero está disponible en github.com/kballard/fontlabel
Lily Ballard
116

Hay una manera simple de usar fuentes personalizadas en iOS 4 .

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

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

@implementation CustomFontLabel

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

@end
alexey
fuente
3
Esto parece estar apoyado de nuevo a 3.2, no sólo 4.0+
Jesse Rusak
1
¡Gracias! El problema que he tenido es que las fuentes personalizadas parecen inclinarse un poco (espacio adicional a continuación) en comparación con sus contrapartes incorporadas. Intenté usar el repositorio FontLabel de GitHub, que ayuda algunas veces, pero no todo el tiempo.
Joe D'Andrea
12
Vale la pena señalar que la cadena que pasa al constructor UIFont NO es el nombre del archivo menos la extensión, es el nombre interno de la fuente. Tuve problemas para cargar una fuente con un nombre de archivo que había acortado. Cuando utilicé el nombre completo de la fuente que figuraba en el archivo, la fuente se cargó bien.
slayton
55
Lo que Slayton acaba de decir es crítico. [UIFont fontWithName: espera el "Nombre completo" de la fuente, que es visible abriéndolo en el Libro de fuentes y seleccionando: Vista previa -> Mostrar información de fuente
electromaggot
51

En Info.plist, agregue la entrada "Fuentes proporcionadas por la aplicación" e incluya los nombres de las fuentes como cadenas:

Fonts provided by application
           Item 0        myfontname.ttf
           Item 1        myfontname-bold.ttf
           ...

Luego verifique que su fuente esté incluida ejecutando:

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

Tenga en cuenta que su nombre de archivo ttf podría no ser el mismo nombre que usa cuando configura la fuente para su etiqueta (puede usar el código anterior para obtener el parámetro "fontWithName"):

[label setFont:[UIFont fontWithName:@"MyFontName-Regular" size:18]];
bdev
fuente
36

editar: esta respuesta no está vigente a partir de iOS3.2; usar UIAppFonts

La única forma en que he podido cargar exitosamente mensajes personalizados UIFontes a través del marco privado GraphicsServices.

Lo siguiente cargará todas las .ttffuentes en el paquete principal de la aplicación:

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 vez que se cargan las fuentes, se pueden usar al igual que las fuentes proporcionadas por Apple:

NSLog(@"Available Font Families: %@", [UIFont familyNames]);
[label setFont:[UIFont fontWithName:@"Consolas" size:20.0f]];

GraphicsServices incluso se puede cargar en tiempo de ejecución en caso de que la API desaparezca en el 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;
}
rpetrich
fuente
nota a los que se preguntan, esto funciona, pero usted tendrá que llamar loadFonts justo antes de utilizar el tipo de letra - no parece que hacen para mantenerse cargada en toda la aplicación
de píxeles
En OS 3.0 definitivamente necesitas usar el segundo segundo ejemplo, no olvides la importación. Funcionó bastante bien para mí.
M. Ryan
Otra nota: este es un marco privado y lo carga dinámicamente ... lo que probablemente detendrá la aceptación de su aplicación en la AppStore.
pixel
¿Cuál es la conclusión? ¿Qué alternativas a este método?
Raj Pawan Gumdal
1
También debería tener en cuenta que [NSString sizeWithFont:[UIFont fontWithName:@"customFont" size:14]];devuelve 0 ancho y alto para cualquier fuente personalizada que he probado.
Luke Mcneice
34

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

1) Arrastre y suelte su fuente a la Xcodecarpeta Archivos de soporte. No olvide marcar su aplicación en la sección Agregar a objetivos . A partir de este momento, puede usar esta fuente IBy elegirla del palet de fuentes.

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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 su nombre de fuente.

func allFonts(){

   for family in UIFont.familyNames(){

       println(family)


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

   }

}

EDITAR

Quiero mencionar que debe agregar archivos de fuentes a las Fases de compilación de su destino , Copiar recursos de paquete . Sin él, no verá su fuente en el dispositivo. Y podría conducir a un comportamiento inesperado.

Por ejemplo, me encuentro con bug, cuando UITextFieldtengo una fuente personalizada, pero esta fuente no estaba en los recursos del paquete de copia . Y cuando sigo viewcontrollercon esto textfield, hay un retraso de aproximadamente 4 segundos antes de viewDidLoadque se llame a la función. Resolver problemas de fuente eliminó este retraso. Por lo tanto, recomiendo verificarlo dos veces. (rdar: // 20028250) Por cierto, no pude reproducir el error, pero estoy seguro de que el problema estaba en la fuente.

Dima Deplov
fuente
1
Solo una nota. Las fuentes personalizadas no están disponibles en LaunchScreens, incluso si están configuradas correctamente en IB. Lo cual puede ser lógico.
Rivera
@ Rivera wow, ¡gran nota! No lo sabia. Una alternativa posible es usar UIImage con texto, creo.
Dima Deplov
@ Rivera, gracias por esa información, ¿está documentado en alguna parte? Estaba repitiendo los pasos repetidamente pensando que me perdí un paso.
spongessuck
@spongessuck no está seguro acerca de su pregunta, pero hay algunos documentos developer.apple.com/library/ios/documentation/StringsTextFonts/…
Dima Deplov
27

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 y vagando con el número mágico para encontrar tu desplazamiento (aquí, mírame usando 29) en la fuente, pero funciona.

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

Genericrich
fuente
1
Estoy seguro de que funciona bien, pero (realmente) no quiero escribir mi propio motor de diseño para manejar todo lo que UILabel y UITextView hacen actualmente por mí, especialmente el ajuste de palabras, el posicionamiento y la edición.
Airsource Ltd
1
AFAICS, esto solo funciona con caracteres en mayúscula, de ahí la llamada 'uppercaseString'.
Martin Cote
2
Estoy votando en contra porque el truco del "número mágico" es un truco puro que realmente no funciona. La solución real es obtener la tabla cmap del archivo TTF.
Martin Cote
1
Esta es una buena información sobre el uso de fuentes directamente con Core Graphics. Solo para actualizar para futuros lectores: en los sistemas operativos más nuevos, uno podría y debería usar Core Text. Alternativamente, uno podría usar CGContextShowTextAtPoint(), aunque no funciona con UTF-8.
Ivan Vučica
20

Sí, puede incluir fuentes personalizadas. Consulte la documentación en UIFont, específicamente, el fontWithName:size:método.

1) Asegúrese de incluir la fuente en su carpeta de recursos.

2) El "nombre" de la fuente no es necesariamente el nombre del archivo.

3) Asegúrese de tener el derecho legal de usar esa fuente. Al incluirlo en su aplicación, también lo está distribuyendo, y necesita tener el derecho de hacerlo.

agosto
fuente
¿Realmente has hecho esto con éxito? No puedo hacer que funcione, y Google solo encuentra a otras personas que lo han intentado y han fallado.
Airsource Ltd
Si. Yo tengo. Nuevamente, asegúrese de estar usando el nombre de fuente apropiado.
Agosto
1
Cuando dice "El" nombre "de la fuente no es necesariamente el nombre del archivo" ... ¿cómo encontrar el nombre correcto?
Keith Fitzgerald
77
Sí, esta respuesta es incorrecta. No puedes hacer esto fuera de la caja.
Jonathan Sterling
Actualización de iOS 9, los documentos de UIFont no mencionan nada acerca de las fuentes personalizadas
Cbas
20

Si está utilizando xcode 4.3, hay que añadir el fontde la Build Phasevirtud Copy Bundle Resources, de acuerdo con https://stackoverflow.com/users/1292829/arne en el hilo, personalizado Fuentes Xcode 4.3 . Esto funcionó para mí, estos son 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 OTF(o TTF) archivos a un nuevo grupo que creé y acepté la elección de xcode copying the files over to the project folder.
  2. Cree la UIAppFontsmatriz con sus fuentes enumeradas como elementos dentro de la matriz. Solo el names, no la extensión (por ejemplo, " GothamBold", " GothamBold-Italic").
  3. Haga clic en el project namecamino en la parte superior del Project Navigatorlado izquierdo de la pantalla.
  4. Haga clic en la Build Phasespestaña que aparece en el área principal de xcode.
  5. Expanda la Copy Bundle Resourcessección " " y haga clic en "+"para agregar la fuente.
  6. Seleccione el archivo de fuente del navegador de archivos que se abre cuando hace clic en "+".
  7. Haga esto para cada fuente que tenga que hacer add to the project.
SKris
fuente
12

Aquí están las instrucciones paso a paso de cómo hacerlo. No necesita biblioteca adicional ni ninguna codificación especial.

http://shang-liang.com/blog/custom-fonts-in-ios4/

La mayoría de las veces el problema es con la fuente, no con el método. La mejor manera de hacerlo es usar una fuente que seguramente funcionará, como verdana o geogia. Luego cambie a la fuente deseada. Si no funciona, tal vez el nombre de la fuente no sea correcto o la fuente no esté bien formateada.

5566
fuente
12

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

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

Abre tu 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 al configurar la fuente, haga lo setFont:"corresponding Font Name"

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

Devuelve toda la fuente que admite su aplicación.

kumar123
fuente
11

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 - Arrastra tu .ttf o .otf desde Finder a tu proyecto

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

Arrastre los archivos de fuentes a su proyecto y haga clic para agregarlos a su destino

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 de destino

cómo agregar fuentes al destino de la aplicación si olvidó

Para asegurarte de que tus fuentes sean parte del objetivo de tu aplicación, asegúrate de que aparezcan en tus Recursos de paquete de copias en Fases de compilación

cómo verificar los recursos para ver si las fuentes son parte del objetivo de la aplicación

Paso 2: agrega los nombres de archivo de fuente 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 en esa sección llamadaFonts provided by application (debería ver que aparece 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 fuente que desea que estén disponibles

NOTA: si su aplicación falla inmediatamente después de este paso, verifique su ortografía en los elementos que agregue aquí

ejemplo plist con fuentes personalizadas agregadas

Paso 3: descubre los nombres de tus fuentes para poder llamarlas

Muy a menudo, el nombre de fuente visto por su aplicación es diferente de lo que cree que se basa en el nombre de archivo de esa fuente, ponga esto en su código y mire 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 debería verse así:

Ejemplo de registro de búsqueda para encontrar nombres de fuentes

Paso 4: use su nueva fuente personalizada con 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];
ColosalChris
fuente
10

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

Nano
fuente
8

Todavía no está disponible, pero la próxima versión de cocos2d (marco de juego 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 lanzamiento fijada para esta versión, pero vi una publicación que indicaba que sería en el próximo mes o dos.

Juan
fuente
8

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

user576862
fuente
7

sigue este paso

1) Copie su fuente en su proyecto

2) abra su .plistarchivo en modo de código fuente ... (Nota: no abrir info.plist)

3) Antes de eso: haga clic derecho en su fuente y ábrala en fontforge o editor similar y install en su sistema, debería serinstall

4) Escriba 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 aún así su fuente no funciona, primero verifique la compatibilidad de sus fuentes

Kirtikumar A.
fuente
1
¿Por qué no abrir info.plist?
Raptor
¿Por qué hay espacio entre Myraid y Pro en el quinto punto cuando no hay ninguno en Plist en el punto 4?
Jayant Rawat
@jayantrawat Su nombre de fuente que se muestra en el sistema después de instalar la fuente, y .plist es el nombre del archivo de fuente [.ttl u otf]
Kirtikumar A.
@KirtikumarA. sí lo conseguí ... implementado con éxito en la aplicación ...
jayant rawat
@jayantrawat si mi solución ayuda, entonces solicito que des un voto positivo sobre la respuesta para que otros usuarios puedan recibir ayuda de la misma manera
Kirtikumar A.
6

¿Quizás el autor olvidó darle a la fuente un nombre Mac FOND ?

  1. Abra la fuente en FontForge y luego vaya a Elemento> Información de fuente
  2. Hay una opción "Mac" donde puede configurar 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!

ByteNirvana
fuente
6

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

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

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

Jacob Wallström
fuente
5

Buscar ATSApplicationFontsPath

Una entrada simple que le permite incluir los archivos de fuente en la carpeta de recursos de su aplicación y que "simplemente funcionan" en su aplicación.

Matt Sephton
fuente
¿Has probado esto en el dispositivo? No me alegré, y buscar en Google sugiere que esta entrada simple no es compatible con iPhone, a pesar de que está documentada para iPhone OS.
Airsource Ltd
1
Lo siento, solo lo estoy usando en una aplicación OS X en este momento.
Matt Sephton
5

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, debe conocer el nombre PostScript de su fuente. Simplemente siga los consejos de @Daniel Wood y presione el comando-i mientras está en FontBook.

Luego, disfruta de tu fuente personalizada.

AaronBaker
fuente
5

Primero agregue la fuente en formato .odt a sus recursos, en este caso usaremos DINEngschriftStd.otf, luego use 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 simplemente llame

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

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

Alejandro Luengo
fuente
5

Para iOS 3.2 y superior: utilice los métodos proporcionados por varios anteriores, que son:

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

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

Yo 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 plist 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.

Jarson
fuente
5

La mejor solución es agregar una nueva propiedad " Fonts provided by application" a su info.plistarchivo.

Luego, puede usar su fuente personalizada como de costumbre UIFont.

RichX
fuente
3

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 en el momento del inicio de la aplicación, lo que puede llevar demasiado tiempo si tiene muchas fuentes.

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

Utiliza la CTFontManagerRegisterGraphicsFontfunción, dándole un búfer con sus datos de fuente. Luego está disponible para UIFonty vistas web, al igual que con el método anterior. Aquí está el código de muestra 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);
David M.
fuente
He usado este código pero recibo el error & Error al cargar la fuente: no se pudo completar la operación. (error 105 de com.apple.coretext - No se pudo registrar el CGFont '<CGFont (0x14fe7df0): Shruti>')
Contratar el
Según la documentación, el error 105 es kCTFontManagerErrorAlreadyRegistered: "El archivo ya se ha registrado en el alcance especificado". developer.apple.com/library/ios/#documentation/Carbon/Reference/…
David M.
3

Swift, forma de código: (funciona también con swift 2.0)

Agregue las fuentes requeridas a su proyecto (al igual que agregar imágenes, simplemente arrastre a Xcode), asegúrese de que estén dirigidas a su proyecto,
agregue este método y cargue fuentes personalizadas (recomendado en 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: "")
    }

}

Use ejemplo:

if let fontPath = NSBundle.mainBundle().pathForResource("My-Font", ofType: "ttf"){
      loadFont(fontPath)
}

Usa la fuente:

UIFont(name: "My-Font", size: 16.5)
Daniel Krom
fuente
Solo me pregunto, ¿cómo es que no solo agregará la fuente en su Info.plist parece mucho más trabajo para esencialmente lo mismo?
Stephen Jesse
2

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

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

Nishan29
fuente
1

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, su fuente aparecerá y todo funcionará bien.

ElizaS
fuente
1

Aunque algunas de las respuestas anteriores son correctas, he escrito un tutorial visual detallado para las personas que todavía tienen problemas con las fuentes.

Las soluciones anteriores que le indican que agregue la fuente al plist y use

[self.labelOutlet setFont:[UIFont fontWithName:@"Sathu" size:10]];

Son los correctos. Por favor, utilice ahora cualquier otra forma hack. Si aún tiene problemas para encontrar nombres de fuentes y agregarlos, aquí está el tutorial:

Usar fuentes personalizadas en la aplicación ios

Bharat Gulati
fuente
Acabo de intentar esto. Parece funcionar, pero mi fuente es pequeña, sin importar el tamaño que configuré. Para lo que vale, estoy usando un archivo OTF disponible gratuitamente: philsfonts.com/index.php/free_fonts
ari gold
Pruébelo con cualquier otra fuente personalizada y si el problema persiste, avíseme. Si funciona de esa manera, entonces hay un problema con su fuente.
Bharat Gulati
1

sí, puedes usar fuentes personalizadas en tu aplicación

paso a paso siguiendo allí:

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

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

Haga 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 tamaño de nombre de fuente personalizado": 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 que viene y copie esta fuente, pegue, aquí [UIFont fontWithName: @ "aquí más allá de su tamaño de Nombre de fuente personalizado": 20]

espero que obtengas la respuesta correcta

Akhil Bhadauria
fuente
1

sí, puedes usar fuentes personalizadas en tu aplicación

paso a paso siguiendo allí:

  • Agregue sus archivos de fuente personalizados a su proyecto en archivos de soporte
  • Agregue una clave a su Info.plistarchivo llamada UIAppFonts.
  • Haga 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
  • Ahorre Info.plist ahora 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 en la parte superior está llegando y copie esta fuente, pegue, aquí [UIFont fontWithName:@" here past your Custom font Name" size:20] espero que obtenga la respuesta correcta

usuario2691469
fuente