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?

carbonr
la source
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]
     }];
TigerCoding
la source
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

Robert
la source
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)]
MLQ
la source
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...

Maishi Wadhwani
la source
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)
totiG
la source
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;
}
leokash
la source
-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.

vishiphone
la source
je sais cela, j'essayais d'utiliser la fonction proxy de l'API d'apparence
carbonr