2010-05-10 14 views
8

He agregado mi fuente personalizada a UIAppFonts y está bien cargada: (aparece en [UIFont familyNames]). Cuando configuro manualmente la fuente en viewDidLoad { [myLabel setFont: [UIFont fontWithName:@"CustomFont" size: 65.0]]; }, todo funciona y la fuente se procesa.iPhone SDK 3.2 y UIAppFonts

Sin embargo, hacer lo mismo en IB no (en su lugar, se usa otra fuente predeterminada). Tener que crear IBOutlets para cada etiqueta y arreglar las fuentes manualmente en viewDidLoad es bastante doloroso.

¿Alguien más tuvo problemas para obtener el soporte de fuente personalizado para trabajar con 3.2 SDK e IB?

Respuesta

2

Abrió un informe de error con Apple y resulta que realmente es un error. La solución que terminé usando es la siguiente:

// LabelQuake.h 
@interface LabelQuake : UILabel 
@end 

// LabelQuake.m 
@implementation LabelQuake 

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

     return self; 
    } 
@end 

Has escrito después un poco más a nuestra blog.

+0

Al usar la solución anterior, funciona, pero por alguna razón, todas las etiquetas que son personalizadas no centran el texto verticalmente en la etiqueta, sino que todas ajustan el texto a la parte superior. ¿Notaste esto? Tiene el efecto de compensar todas mis etiquetas y hacer que todo parezca fuera de línea. – Andrew

+1

En respuesta a mi propio comentario anterior, "solucioné" el problema marcando self.font.ascender antes de establecer la nueva fuente, y luego compensando toda la etiqueta por la diferencia _después_ de configurar la fuente. – Andrew

2

tenían simillar tipo de problem.and fija de esta manera ...

Añadir mi fuente personalizada a mi grupo de recursos. a continuación, cargue todas las fuentes con el siguiente código:

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


- (id)initWithCoder:(NSCoder *)decoder { 
    //load the fonts 
    [self loadFonts]; 

    if (self = [super initWithCoder: decoder]) { 
     [self setFont: [UIFont fontWithName: @"Quake" size: self.font.pointSize]]; 
    } 

    return self; 
} 

Espero que funcione.

+1

no agregó las fuentes a la propiedad UIAppFonts en Info.plist porque las carguen? – Tarmo

+0

puede ser ... pero funciona para mí .... – makboney

+0

este pequeño truco que tienes aquí me hace muy feliz :) Con esto puedo usar fuentes personalizadas con facilidad cuando me oriento a iOS <3.2. ¿Está usando un marco privado? –

1

Si no desea tener la subclase, esta solución funcionó rápido y sucio para mí. Por supuesto, se supone que todas las etiquetas tienen la misma fuente, y en mi caso ese fue el caso.

for (UIView *v in view.subviews) { 

    if ([v isKindOfClass:[UILabel class]]) { 
     UILabel *label = (UILabel*)v; 

     [label setFont:[UIFont fontWithName:@"Quake" size:label.font.pointSize]]; 
    } 
} 

Puse esto en una clase de ayuda y lo llamé, pasando en mi vista actual.

+0

en lugar de cambiar CADA fuente. establecería el UIView.tag solo para las etiquetas que desea cambiar y luego revisarlo también funciona –