2011-03-12 17 views
27

Sé que puede personalizar fuentes mediante el uso de Interface Builder y seleccionando una fuente. Sin embargo, tengo curiosidad si puedo usar una fuente personalizada que no está incluida por defecto en los sistemas. ¿Hay alguna manera de incluir una fuente personalizada en mi aplicación?Fuente personalizada en una aplicación Cocoa

+24

@poke: Esto no es un duplicado, esto es para Mac ** **, como claramente se indica en mis etiquetas. Por favor, lea más atentamente. –

+1

Oh, mi mal. Lo siento por eso. – poke

+0

@poke: Está bien. :) –

Respuesta

46

Si bien el procedimiento de activación manual de la fuente es una opción, también puede considerar la tecla ATSApplicationFontsPath Info.plist:

Information Property List Key Reference:

"ATSApplicationFontsPath (String - Mac OS X ) identifica la ubicación de un archivo de fuente o un directorio de fuentes en el directorio del paquete Resources. Si prese nt, Mac OS X activa las fuentes en la ruta especificada para usar con la aplicación empaquetada . Las fuentes son activadas solo para la aplicación incluida y no para el sistema como en su conjunto. La ruta en sí debe ser especificada como un directorio relativo de el directorio de Recursos del paquete. Para ejemplo, si un directorio de las fuentes era en la ruta /Applications/MyApp.app/Contents/Resources/Stuff/MyFonts/, debe especificar la cadena Stuff/MyFonts/ para el valor de esta clave ."

estaría seguro de volver a verificar, pero creo que esta funcionalidad se agregó en OS X 10.5.x (que el código publicado por Jinhyung Park apunta).

+0

Sí o usted puede usar Core Text que se introdujo en Snow Leopard, creo. –

+0

Esta solución es el camino correcto a seguir. Gracias por mencionarlo. –

+0

Esto es mucho más fácil. Gracias – drudru

-6

He logrado hacer esto usando cocos2d (CCLabelBMFont) y herramienta hiero. Tendrá que crear la fuente usando el hiero, y darle esta fuente al objeto CCLabelBMFont.

+3

Mi pregunta es sobre ** Mac **, no sobre el iPhone. –

3

Este es el ejemplo de la carga personalizada de fuentes de la aplicación Mac.

NSString *fontFilePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"/fonts"]; 
fontsURL = [NSURL fileURLWithPath:fontFilePath]; 
if(fontsURL != nil) 
{ 
    OSStatus status; 
    FSRef fsRef; 
    CFURLGetFSRef((CFURLRef)fontsURL, &fsRef); 
    status = ATSFontActivateFromFileReference(&fsRef, kATSFontContextLocal, kATSFontFormatUnspecified, 
               NULL, kATSOptionFlagsDefault, NULL); 
    if (status != noErr) 
    { 
     errorMessage = @"Failed to acivate fonts!"; 
     goto error; 
    } 
} 
+1

¿No puedes simplemente llamar '[NSFont fontWithName: @" fontname "]'? –

+0

Leo el debate en http://cocoadev.com/index.pl?UsingCustomFontsInYourCocoaAplications. Después de cargar sus fuentes, puede usar [NSFont fontWithName: @ ""]. Acabo de comprobar en mi aplicación Mac OS X que está funcionando. –

+0

Es curioso que no encuentre nada en la ayuda de Xcode ni en ADC cuando busca ATSFontActivateFromFileReference; necesita ir a "ATS/ATSFont.h" en su disco duro para obtener información .. – Jay

3

ATSApplicationFontsPath utiliza la ruta [NSBundle mainbundle] como ruta base, por lo que no funciona cuando la carpeta Resources no está ubicada allí (por ejemplo, para los complementos de aplicaciones).

En mi plugin de cacao que tienen que cargar fuentes personalizadas utilizando CTFontManagerRegisterFontsForURL

#import <Cocoa/Cocoa.h> 

static void FGDActivateFont(NSString *fontName) 
{ 

    // Can't make ATSApplicationFontsPath in Info.plist work for plugins (non-standard Resources path) 

    NSArray *availableFonts = [[NSFontManager sharedFontManager] availableFonts]; 

    if (![availableFonts containsObject:fontName]) { 

     NSURL *fontURL = [[FGDRapidCart bundle] URLForResource:fontName withExtension:@"ttf" subdirectory:@"Fonts"]; 
     assert(fontURL); 
     CFErrorRef error = NULL; 
     if (!CTFontManagerRegisterFontsForURL((__bridge CFURLRef)fontURL, kCTFontManagerScopeProcess, &error)) 
     { 
      CFShow(error); 
     } 

    } 

} 

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool 
    { 
     FGDActivateFont(@“FontAwesome”); 
    } 
    return NSApplicationMain(argc, (const char **)argv); 
} 

Créditos: https://github.com/OneSadCookie/Extendaword/blob/master/Extendaword/main.m

+0

Buena respuesta, necesitaba esto para mi protector de pantalla, los valores de plist no funcionarían allí. –

Cuestiones relacionadas