He buscado en este sitio, pero me acabo de enterar de preguntas sin respuesta.

Me he cargado una fuente personalizada en mi proyecto de xcode. Un [UIFont fontWithName:@"Laconic-Light" size:19] obras. Pero interface builder no le gusta el tipo de letra. No los puedo usar con IB que siempre muestra la fuente predeterminada. Hay una manera de decirle a IB que su autorización para utilizar la fuente?

  • stackoverflow.com/questions/3419346/…
  • Tan sólo roto… 😛
  • miedo así 🙁 tal vez puede reemplazar IB y el cambio a través de programación?
  • Eso es lo que yo hago. Lo justo hubiera sido bueno para mi situación. Estoy de carga en diferentes xibs para el mismo punto de vista. Así que tengo que ir: Es xib 1? Cambiar todas las etiquetas y el botón de títulos a Lacónica. Es xib 2? Cambiar todas las etiquetas… 😛
  • no un duplicado..
  • Usted puede encontrar un muy útil tutorial aquí abdus.me/ios-programación-consejos/…
  • Esto no es un duplicado. Esta pregunta es acerca de cómo utilizar una fuente personalizada en el Interface Builder. Los posibles duplicados es sobre el uso de un sistema de fuentes en el Interface Builder.
  • En la Configuración de la fuente de UILabel con Interface Builder sale Helvetica resulta que era un error en una particular versión de la Interface Builder. Esta resolución no se aplica a esta pregunta.

InformationsquelleAutor david | 2010-11-26

6 Comentarios

  1. 63

    También tengo este problema en Xcode 4. En mi programa, hay un montón de UILabel que no tienen IBOutlets así que lo hago de esa manera;

    Primero, de la subclase de los UILabel a CustomFontLabel

    A continuación, reemplazar el «awakeFromNib» método

    @implementation CustomFontLabel
    
    - (void)awakeFromNib {
        [super awakeFromNib];
        self.font = [UIFont fontWithName:@"CustomFontName" size:self.font.pointSize];
    }
    
    @end

    Finalmente, en el Interface Builder > Identidad del Inspector de cambio de clase para CustomFontLabel.

    • ¿esto realmente muestra la etiqueta con la fuente correcta dentro de la interfaz del generador de entonces? No sólo en tiempo de ejecución en la aplicación?
    • Sólo en tiempo de ejecución, ya que es una subclase.
    • Realmente triste que apple no ayudar a los desarrolladores a… Pensar en lo molesto es desarrollar una aplicación a través de muchas fuentes diferentes…
    • Apple es ayudar a los desarrolladores (en su mente), como una aplicación con 20 fuentes diferentes que sería un terrible experiencia de usuario
    • Solución agradable, es una lástima que Apple aún no ha fijado una evidente y frustrado error en Xcode.
  2. 5

    Otra solución sería subclase UILabel a la carga en la fuente personalizada. Usted puede, a continuación, hacer referencia a ella en IB, aunque todavía no se puede ver la fuente adecuada.

  3. 3

    Prefiero hacer esto en un poco más de forma genérica, que permite el tamaño de su texto en el Interface Builder, y simplemente reemplazar las fuentes en tiempo de ejecución.

    Puedo crear una IBCollection de la propiedad por cualquier UIKit elementos para configurar una fuente para, a continuación, conectar los elementos apropiados de IB.

    @property (strong, nonatomic) IBOutletCollection(id) NSArray *lightFontItems;
    @property (strong, nonatomic) IBOutletCollection(id) NSArray *regularFontItems;

    A continuación, en mi opinión, hizo cargar puedo usar un método como este:

    [self setFontName:@"Roboto-Light" onItemsInArray:[self lightFontItems]];
    [self setFontName:@"Roboto-Regular" onItemsInArray:[self regularFontItems]];

    Y la setLightFontOnItemsInArray: método se parece a esto:

    + (void)setFontName:(NSString *)fontName onItemsInArray:(NSArray *)array;
    {
      [array each:^(id item) {
        if (![item respondsToSelector:@selector(setFont:)]) return;
        [item performSelector:@selector(setFont:) withObject:[UIFont fontWithName:fontName size:[[item font] pointSize]]];
      }];
    }
    • Pensaba que mencionar que se puede utilizar KVC hacerlo: [self.lightFontItems setValue:[UIFont fontWithName:@"Roboto-Light" size:12] forKey:@"font"].
  4. 3

    Gracias a apple, en Xcode 6, tenemos fuentes personalizadas disponibles en la interfaz del generador de sí mismo.

    1. Agregar el .archivo de fuente ttf a su paquete de
    2. Agregar el nombre de la fuente a el .plist archivo.
    3. Ir a la xib/archivo de guión gráfico, se puede ver la fuente.

    El uso de fuentes personalizadas en el interface builder

    • ¿podría ser más específico?, gracias.
    • actualizado mi respuesta
  5. 1

    Swizzle una Fuente

    La solución general es sencillo si swizzle la UIFont clase. Creo que lo mejor es elegir una sana fuente como la Helvetica Neue y anulación. Esto permite que usted para poner a todo el proyecto de nuevo en el estándar tirando de la asignación. Yo ya había llegado con un swizzle para lograr este objetivo cuando me di cuenta de alguien hizo demasiado así que me puré un poco. Como NSHipster le dirá swizzling puede ser peligroso, pero en este caso, el riesgo es bastante bajo teniendo en cuenta la absoluta simplicidad de la UIFont de la API. En mi caso fue hecho por una Empresa de la aplicación de lo que era aún menor riesgo.

    UIFont+CustomFont.m Categoría

    #import <objc/runtime.h>
    static NSString *const kFontMapPlist = @"FontMap";
    static NSDictionary *_replacementFontDictionary = nil;
    @implementation UIFont (CustomFont)
    static void initializeReplacementFonts()
    {
    static BOOL initialized = NO;
    if (initialized)
    return;
    initialized = YES;
    //A Plist with a Dictionary from->to font name mapping
    NSURL *replacementFontMapURL = [[NSBundle mainBundle] URLForResource:kFontMapPlist withExtension:@"plist"];
    NSDictionary *replacementFontMap = [NSDictionary dictionaryWithContentsOfURL:replacementFontMapURL];
    [UIFont setReplacementFontDictionary:replacementFontMap];
    }
    + (void)load
    {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    initializeReplacementFonts();
    SEL fontWithNameSizeSelector = @selector(fontWithName:size:);
    SEL swizzledFontWithNameSizeSelector = @selector(clp_fontWithName:size:);
    SwizzleClassMethod([UIFont class], fontWithNameSizeSelector, swizzledFontWithNameSizeSelector);
    SEL fontWithDescriptorSizeSelector = @selector(fontWithDescriptor:size:);
    SEL swizzledfontWithDescriptorSelector = @selector(clp_fontWithDescriptor:size:);
    SwizzleClassMethod([UIFont class], fontWithDescriptorSizeSelector, swizzledfontWithDescriptorSelector);
    });
    }
    void SwizzleClassMethod(Class class, SEL originalSelector, SEL replacementSelector)
    {
    Class clazz = objc_getMetaClass(class_getName(class));
    Method originalMethod = class_getClassMethod(clazz, originalSelector);
    Method replacementMethod = class_getClassMethod(clazz, replacementSelector);
    //Add method if it doesn't eixst
    BOOL didAddMethod =
    class_addMethod(clazz,
    originalSelector,
    method_getImplementation(replacementMethod),
    method_getTypeEncoding(replacementMethod));
    if (didAddMethod) {
    class_replaceMethod(clazz,
    replacementSelector,
    method_getImplementation(originalMethod),
    method_getTypeEncoding(originalMethod));
    } else {
    method_exchangeImplementations(originalMethod, replacementMethod);
    }
    }
    #pragma mark - Swizzled font by descriptor and name calls
    + (UIFont *)clp_fontWithDescriptor:(UIFontDescriptor *)descriptor size:(CGFloat)pointSize
    {
    NSString *originalFontName = descriptor.fontAttributes[UIFontDescriptorNameAttribute];
    NSString *replacementFontName = _replacementFontDictionary[originalFontName];
    UIFontDescriptor *replacementFontDescriptor = descriptor;
    if (replacementFontName != nil) {
    replacementFontDescriptor = [UIFontDescriptor fontDescriptorWithFontAttributes:@{UIFontDescriptorNameAttribute: replacementFontName}];
    }
    return [self clp_fontWithDescriptor:replacementFontDescriptor size:pointSize];
    }
    + (UIFont *)clp_fontWithName:(NSString *)fontName size:(CGFloat)fontSize
    {
    NSString *replacementFontName = _replacementFontDictionary[fontName];
    if (replacementFontName == nil) {
    replacementFontName = fontName;
    }
    return [self clp_fontWithName:replacementFontName size:fontSize];
    }
    #pragma mark - Replacement Dictionary Getter and Setter
    + (NSDictionary *)replacementDictionary
    {
    return _replacementFontDictionary;
    }
    + (void)setReplacementFontDictionary:(NSDictionary *)replacmentFontDictionary
    {
    if (replacmentFontDictionary == _replacementFontDictionary) {
    return;
    }
    _replacementFontDictionary = replacmentFontDictionary;
    //Validate font existence.
    for (NSString *originalFontName in [_replacementFontDictionary allKeys]) {
    NSString *replacementFontName = [_replacementFontDictionary objectForKey:originalFontName];
    UIFont *replacementFont = [UIFont fontWithName:replacementFontName size:10.0f];
    if (replacementFont == nil) {
    DDLogError(@"WARNING: replacement font '%@' is not available.", replacementFontName);
    }
    }
    }
    @end

    La FontMap.plist

    Por el bien de la simplicidad vamos a suponer que tenemos una fuente llamada CustomSans.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    <key>HelveticaNeue-Light</key>
    <string>CustomSans-Light</string>
    <key>HelveticaNeue-LightItalic</key>
    <string>CustomSans-LightItalic</string>
    <key>HelveticaNeue-Bold</key>
    <string>CustomSans-Bold</string>
    <key>HelveticaNeue-BoldItalic</key>
    <string>CustomSans-BoldItalic</string>
    </dict>
    </plist>

Dejar respuesta

Please enter your comment!
Please enter your name here