¿Cómo configurar la fuente y el color del título en UINavigationBar usando la API de apariencia de iOS5?

90

Tengo varios controladores de vista y quiero establecer el color de fuente de todos en rojo.

 [[UINavigationBar appearance] setFont:[UIFont boldSystemFontOfSize:12.0]];

arroja un error de selector no reconocido.

¿Cómo puedo arreglar esto?

carbonatador
fuente
Luego, debe establecer la etiqueta y la vista en la barra de navegación y establecer el color de la fuente
vishiphone

Respuestas:

207

De Ray Wenderlich:

http://www.raywenderlich.com/4344/user-interface-customization-in-ios-5

// Customize the title text for *all* UINavigationBars
[[UINavigationBar appearance] setTitleTextAttributes:
    [NSDictionary dictionaryWithObjectsAndKeys:
        [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:1.0], 
        UITextAttributeTextColor, 
        [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8], 
        UITextAttributeTextShadowColor, 
        [NSValue valueWithUIOffset:UIOffsetMake(0, -1)], 
        UITextAttributeTextShadowOffset, 
        [UIFont fontWithName:@"Arial-Bold" size:0.0], 
        UITextAttributeFont, 
        nil]];

O si lo prefiere con el estilo literal del objeto:

[[UINavigationBar appearance] setTitleTextAttributes:@{
    UITextAttributeTextColor: [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:1.0],
    UITextAttributeTextShadowColor: [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8],
    UITextAttributeTextShadowOffset: [NSValue valueWithUIOffset:UIOffsetMake(0, -1)],
    UITextAttributeFont: [UIFont fontWithName:@"Arial-Bold" size:0.0],
}];

Editar para iOS 7 y siguientes

UITextAttributes está obsoleto como iOS 7, puede usar lo siguiente:

NSShadow *shadow = [[NSShadow alloc] init];
shadow.shadowColor = [UIColor colorWithWhite:.0f alpha:1.f];
shadow.shadowOffset = CGSizeMake(0, -1);

[[UINavigationBar appearance] setTitleTextAttributes:@{
     NSForegroundColorAttributeName: [UIColor whiteColor],
     NSShadowAttributeName: shadow,
     NSFontAttributeName: [UIFont fontWithName:@"Arial-Bold" size:15.0f]
     }];
TigreCodificación
fuente
1
Durante más de 1 hora, estuve luchando con esa parte del código del tutorial, lo que lleva a recortar el título de mi elemento de navegación después del primer empujón ... Tenga cuidado con el tamaño de fuente, que era el problema en mi situación ... Aparentemente tamaño 0.0 no funcionó para mí ...
Bartu
3
el nuevo diccionario literal hará que esto sea mucho más bonito
tybro0103
Solo como nota al margen, esto es solo 5.0+, si es compatible con 4, entonces vale la pena hacerlo if ([navBarInstance respondsToSelector:@selector(appearance)])primero porque bloqueará las versiones de iOS por debajo de 5.
Adam Waite
1
El nombre de la fuente es incorrecto y bloquea la aplicación. Pruebe algo como Arial-BoldMT.
MacMark
17
TIL UITextAttributeTextColorestá en desuso en favor de NSForegroundColorAttributeNameiOS 7
Brenden
23

Para los destinos de implementación mayores o iguales que iOS 6, debe usar NSShadowen su lugar:

NSShadow * shadow = [[NSShadow alloc] init];
shadow.shadowColor = [UIColor lightGrayColor];
shadow.shadowOffset = CGSizeMake(0, -2);

NSDictionary * navBarTitleTextAttributes =
@{ NSForegroundColorAttributeName : [UIColor redColor],
   NSShadowAttributeName          : shadow,
   NSFontAttributeName            : [UIFont systemFontOfSize:14] };

[[UINavigationBar appearance] setTitleTextAttributes:navBarTitleTextAttributes];

ingrese la descripción de la imagen aquí

Robert
fuente
19

Haciendo esto en iOS 8+ y en Swift. No hay un setTitleTextAttributesobjeto de apariencia. En su lugar, haz esto:

UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : AppTheme.fontWithSize(18)]
MLQ
fuente
5

Hice esto agregando solo algunas líneas de código en la clase AppDelegate.m método didFinishLaunchingWithOptions: Use este código:

NSDictionary *navbarTitleTextAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                           [UIColor colorWithRed:255.0f/255.0f green:0.0f/255.0f blue:0.0f/255.0f alpha:1.0],UITextAttributeTextColor,
                                           [UIColor clearColor], UITextAttributeTextShadowColor,
                                           [NSValue valueWithUIOffset:UIOffsetMake(-1, 0)], UITextAttributeTextShadowOffset, nil];

[[UINavigationBar appearance] setTitleTextAttributes:navbarTitleTextAttributes];

esto funciona para mi...

Maishi Wadhwani
fuente
5

Si necesita hacer esto en Swift, puede crear una extensión para UINavigationBar que le permita obtener o establecer estas configuraciones.

extension UINavigationBar {
var titleColor: UIColor? {
    get {
        if let attributes = self.titleTextAttributes {
            return attributes[NSForegroundColorAttributeName] as? UIColor
        }
        return nil
    }
    set {
        if let value = newValue {
            self.titleTextAttributes = [NSForegroundColorAttributeName: value]
        }
    }
}

var titleFont: UIFont? {
    get {
        if let attributes = self.titleTextAttributes {
            return attributes[NSFontAttributeName] as? UIFont
        }
        return nil
    }
    set {
        if let value = newValue {
            self.titleTextAttributes = [NSFontAttributeName: value]
        }
    }
    }
}

Luego puede establecer el color y la fuente de esta manera:

navigationBar.titleColor = UIColor.redColor()
navigationBar.titleFont = UIFont.systemFontOfSize(12)
TotiG
fuente
Supongo que esta solución funciona si usa cualquiera titleColoro titleFontindividualmente. Si las usa juntas, self.titleTextAttributesse establecerá en un nuevo valor cada vez que se llame a una de las variables. El establecedor probablemente podría obtener el otro valor cuando crea el nuevo diccionario.
user023
1

Esto podría usarse para establecer una vista personalizada en una barra de navegación única en lugar de una configuración global

- (void)updateTitleWithString:(NSString *)title
{
    UIView *headerView = [[UIView alloc] initWithFrame:CGRectZero];
    [headerView setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
    [headerView setAutoresizesSubviews:YES];

    CGFloat headFontSize = (IS_SYSTEM_DEVICE_IPAD ? 25.0f : 19.0f);
    UIFont *headFont = [UIFont boldSystemFontOfSize: headFontSize ];

    NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
    [style setLineBreakMode:NSLineBreakByTruncatingTail];

    CGSize size = [title boundingRectWithSize:CGSizeMake(190,headFontSize + 6) options:NSStringDrawingUsesLineFragmentOrigin
                                   attributes:@{NSFontAttributeName : headFont, NSParagraphStyleAttributeName : style} context:nil].size;

    headerView.frame  = CGRectMake(0, 0,size.width,self.navigationController.navigationBar.frame.size.height);
    float labelHeight = headFontSize + 6;
    float labelYLoc   = (   self.navigationController.navigationBar.frame.size.height - labelHeight ) / 2;
    UILabel *label    = [[UILabel alloc] initWithFrame:CGRectMake(0,labelYLoc, size.width,labelHeight)];
    label.backgroundColor = [UIColor clearColor];
    label.adjustsFontSizeToFitWidth = YES;
    label.textAlignment = NSTextAlignmentCenter;
    label.textColor = [UIColor whiteColor];
    label.font = headFont;
    label.text = title;
    label.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.4];
    label.lineBreakMode = NSLineBreakByTruncatingTail;
    label.shadowOffset = CGSizeMake(0,-1);
    label.accessibilityLabel = @"<LABEL>";
    [headerView addSubview:label];

    self.navigationItem.titleView = headerView;
}
leokash
fuente
-5

Usa esta línea de código

UILabel *badge_Label=[[UILabel alloc]initWithFrame:CGRectMake(5,3, 15, 15)];
badge_Label.backgroundColor=[UIColor redcolor];
badge_Label.font=[UIFont systemFontOfSize:12];
[badge_Label setText:@"20"];
[self.navigationController.navigationBar addSubview:badgelabel];

Creo que esto te será de ayuda.

vishiphone
fuente
Lo sé, estaba intentando usar la función de proxy de la API de apariencia
carbonr