Comment définir la police et la couleur du titre dans UINavigationBar à l'aide de l'API d'apparence iOS5?


90

J'ai plusieurs contrôleurs de vue et je souhaite définir la couleur de la police de tous sur rouge.

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

lance une erreur de sélecteur non reconnue.

Comment puis-je réparer cela?


Ensuite, vous devez définir le libellé et la vue sur la barre de navigation et définir la couleur de la police
vishiphone

Réponses:


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]];

Ou si vous préférez avec le style littéral d'objet:

[[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],
}];

Modifier pour iOS 7 et suivants

UITextAttributes est obsolète car iOS 7 vous pouvez utiliser ce qui suit:

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

1
Pendant plus d'une heure, j'ai eu du mal avec cette partie de code du tutoriel, ce qui conduit à recadrer le titre de mon élément de navigation après le premier push ... Faites attention à la taille de la police, qui était le problème dans ma situation ... Apparemment, la taille 0.0 n'a pas fonctionné pour moi ...
Bartu

3
le nouveau dictionnaire littéral le rendra beaucoup plus joli
tybro0103

En passant, il s'agit de 5.0+ uniquement, si vous supportez 4, cela vaut la peine de le faire d' if ([navBarInstance respondsToSelector:@selector(appearance)])abord car il plantera les versions iOS inférieures à 5.
Adam Waite

1
Le nom de la police est incorrect et bloque l'application. Essayez quelque chose comme Arial-BoldMT.
MacMark

17
TIL UITextAttributeTextColorest obsolète au profit de NSForegroundColorAttributeNamedans iOS 7
Brenden

23

Pour les cibles de déploiement supérieures ou égales à iOS 6, vous devez utiliser à la NSShadowplace:

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];

entrez la description de l'image ici


19

Faire cela sur iOS 8+ et dans Swift. Il n'y a pas setTitleTextAttributesd'objet d'apparence. Au lieu de cela, faites ceci:

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

5

Je l'ai fait en ajoutant seulement quelques lignes de code dans la méthode AppDelegate.m class didFinishLaunchingWithOptions: Utilisez ce code:

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];

ça marche pour moi...


5

Si vous devez le faire dans Swift, vous pouvez créer une extension pour UINavigationBar pour vous permettre d'obtenir ou de définir ces paramètres.

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]
        }
    }
    }
}

Vous pouvez ensuite définir la couleur et la police comme ceci:

navigationBar.titleColor = UIColor.redColor()
navigationBar.titleFont = UIFont.systemFontOfSize(12)

Je suppose que cette solution fonctionne si vous utilisez l'un titleColorou l' autre ou titleFontindividuellement. Si vous les utilisez ensemble, le self.titleTextAttributessera défini sur une nouvelle valeur à chaque fois qu'une des variables est appelée. Le setter pourrait probablement obtenir l'autre valeur lors de la création du nouveau dictionnaire.
user023

1

Cela pourrait être utilisé pour définir une vue personnalisée sur une barre de navigation unique au lieu d'un paramètre 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;
}

-5

Utilisez cette ligne de code

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];

Je pense que cela vous sera utile.


je sais cela, j'essayais d'utiliser la fonction proxy de l'API d'apparence
carbonr
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.