Come impostare il carattere e il colore del titolo in UINavigationBar utilizzando l'API di aspetto iOS5?


90

Ho più View Controller e voglio impostare il colore del carattere di tutti su rosso.

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

sta generando un errore del selettore non riconosciuto.

Come posso risolvere questo problema?


Quindi dovresti impostare l'etichetta e visualizzare sulla barra di navigazione e impostare il colore del carattere
vishiphone

Risposte:


207

Da 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 se preferisci con lo stile letterale dell'oggetto:

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

Modifica per iOS 7 e successivi

UITextAttributes è deprecato poiché iOS 7 è possibile utilizzare quanto segue:

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
Per oltre 1 ora, ho lottato con quella parte di codice del tutorial, che porta a ritagliare il titolo del mio elemento di navigazione dopo la prima spinta ... Fai attenzione alla dimensione del carattere, che era il problema nella mia situazione ... Dimensioni apparentemente 0,0 non ha funzionato per me ...
Bartu

3
il nuovo dizionario letterale lo renderà molto più
carino

Come nota a margine, questo è solo 5.0+, se stai supportando 4, vale la pena farlo if ([navBarInstance respondsToSelector:@selector(appearance)])prima perché bloccherà le versioni iOS inferiori a 5.
Adam Waite

1
Il nome del carattere è sbagliato e l'app si arresta in modo anomalo. Prova qualcosa come Arial-BoldMT.
MacMark

17
TIL UITextAttributeTextColorè deprecato a favore di NSForegroundColorAttributeNameiOS 7
Brenden

23

Per obiettivi di distribuzione maggiori o uguali a iOS 6, dovresti usare NSShadowinvece:

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

inserisci qui la descrizione dell'immagine


19

Farlo su iOS 8+ e in Swift. Non esiste un setTitleTextAttributesoggetto per l'aspetto. Invece, fai questo:

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

5

L'ho fatto aggiungendo solo poche righe di codice nel metodo didFinishLaunchingWithOptions della classe AppDelegate.m: Usa questo codice:

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

per me funziona...


5

Se è necessario eseguire questa operazione in Swift, è possibile creare un'estensione per UINavigationBar per consentire di ottenere o impostare queste impostazioni.

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

È quindi possibile impostare il colore e il carattere in questo modo:

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

Immagino che questa soluzione funzioni se usi uno titleColoro l'altro o titleFontindividualmente. Se le usate insieme, self.titleTextAttributesverrà impostato un nuovo valore ogni volta che viene chiamata una delle variabili. Il setter potrebbe probabilmente ottenere l'altro valore quando crea il nuovo dizionario.
user023

1

Può essere utilizzato per impostare una visualizzazione personalizzata su una singola navigationBar invece di un'impostazione globale

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

Usa questa riga di codice

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

Penso che questo ti sarà utile.


lo so, stavo cercando di utilizzare la funzione proxy dell'API di aspetto
carbonr
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.