Me gustaría que una aplicación incluya una fuente personalizada para representar texto, cargarla y luego usarla con UIKit
elementos estándar como UILabel
. es posible?
Me gustaría que una aplicación incluya una fuente personalizada para representar texto, cargarla y luego usarla con UIKit
elementos estándar como UILabel
. es posible?
Respuestas:
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)
Info.plist
archivo llamado UIAppFonts
.UIAppFonts
matrizInfo.plist
[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.
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 UILabel
y 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.h
y 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.plist
archivo 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 UILabels
y UITextViews
, etc.
Hay una manera simple de usar fuentes personalizadas en iOS 4 .
Chalkduster.ttf
) a la carpeta Recursos del proyecto en XCode.info.plist
y agregue una nueva clave llamada UIAppFonts
. El tipo de esta clave debe ser matriz.Chalkduster.ttf
).[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 UILabel
subclase personalizada :
@implementation CustomFontLabel
- (id)initWithCoder:(NSCoder *)decoder
{
if (self = [super initWithCoder: decoder])
{
[self setFont: [UIFont fontWithName: @"Chalkduster" size: self.font.pointSize]];
}
return self;
}
@end
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]];
editar: esta respuesta no está vigente a partir de iOS3.2; usar UIAppFonts
La única forma en que he podido cargar exitosamente mensajes personalizados UIFont
es a través del marco privado GraphicsServices.
Lo siguiente cargará todas las .ttf
fuentes 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;
}
[NSString sizeWithFont:[UIFont fontWithName:@"customFont" size:14]];
devuelve 0 ancho y alto para cualquier fuente personalizada que he probado.
Con iOS 8
+ y Xcode 6
+ puedes hacer esto fácilmente. Aquí están los pasos:
1) Arrastre y suelte su fuente a la Xcode
carpeta 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 IB
y elegirla del palet de fuentes.
2) Para que esta fuente esté disponible en su dispositivo, abra su clave info.plist
y 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.
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)")
}
}
}
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 UITextField
tengo una fuente personalizada, pero esta fuente no estaba en los recursos del paquete de copia . Y cuando sigo viewcontroller
con esto textfield
, hay un retraso de aproximadamente 4 segundos antes de viewDidLoad
que 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.
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.
CGContextShowTextAtPoint()
, aunque no funciona con UTF-8.
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.
Si está utilizando xcode 4.3
, hay que añadir el font
de la Build Phase
virtud 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:
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
.UIAppFonts
matriz con sus fuentes enumeradas como elementos dentro de la matriz. Solo el names
, no la extensión (por ejemplo, " GothamBold
", " GothamBold-Italic
").project name
camino en la parte superior del Project Navigator
lado izquierdo de la pantalla.Build Phases
pestaña que aparece en el área principal de xcode.Copy Bundle Resources
sección " " y haga clic en "+"
para agregar la fuente."+"
.add to the project
.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.
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.
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
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
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
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í
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í:
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];
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.
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.
sigue este paso
1) Copie su fuente en su proyecto
2) abra su .plist
archivo 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
info.plist
?
¿Quizás el autor olvidó darle a la fuente un nombre Mac FOND ?
También puede probar la opción "Apple" en el diálogo de exportación.
DESCARGO DE RESPONSABILIDAD : ¡No soy un desarrollador de iPhone!
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 GSFontAddFromFile
no es parte de iOS 3.1.2, por lo que debe cargarse dinámicamente como lo describe @rpetrich.
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.
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.
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)
Para iOS 3.2 y superior: utilice los métodos proporcionados por varios anteriores, que son:
[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.
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 CTFontManagerRegisterGraphicsFont
función, dándole un búfer con sus datos de fuente. Luego está disponible para UIFont
y 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);
kCTFontManagerErrorAlreadyRegistered
: "El archivo ya se ha registrado en el alcance especificado". developer.apple.com/library/ios/#documentation/Carbon/Reference/…
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)
Puede agregar los archivos "FONT" necesarios dentro de la carpeta de recursos. Luego vaya al Info.plist
archivo 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];
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:
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
sí, puedes usar fuentes personalizadas en tu aplicación
paso a paso siguiendo allí:
Info.plist
archivo llamada UIAppFonts.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