Wie kann ich Schriftart und Farbe des Titels in UINavigationBar mithilfe der iOS5-Darstellungs-API festlegen?

90

Ich habe mehrere View Controller und möchte die Schriftfarbe aller auf Rot setzen.

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

löst einen nicht erkannten Auswahlfehler aus.

Wie kann ich das beheben?

carbonr
quelle
Dann sollten Sie die Beschriftung und Ansicht in der Navigationsleiste festlegen und die Schriftfarbe
festlegen

Antworten:

207

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

Oder wenn Sie mit dem Objektliteralstil bevorzugen:

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

Bearbeiten Sie für iOS 7 und folgende

UITextAttributes sind veraltet, da iOS 7 Folgendes verwenden kann:

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
quelle
1
Über 1 Stunde lang hatte ich Probleme mit dem Teil des Codes aus dem Tutorial, der dazu führt, dass der Titel meines Navigationselements nach dem ersten Druck abgeschnitten wird ... Seien Sie vorsichtig mit der Schriftgröße, die in meiner Situation das Problem war ... Anscheinend Größe 0.0 hat bei mir nicht funktioniert ...
Bartu
3
Das neue Wörterbuch-Literal wird dies viel
schöner
Nur als Randnotiz ist dies nur 5.0+. Wenn Sie 4 unterstützen, lohnt es sich, dies if ([navBarInstance respondsToSelector:@selector(appearance)])zuerst zu tun, da iOS-Versionen unter 5 abstürzen.
Adam Waite
1
Der Schriftname ist falsch und stürzt die App ab. Versuchen Sie etwas wie Arial-BoldMT.
MacMark
17
TIL UITextAttributeTextColorist zugunsten von NSForegroundColorAttributeNameiOS 7
Brenden
23

Für Bereitstellungsziele, die größer oder gleich iOS 6 sind, sollten Sie NSShadowstattdessen Folgendes verwenden :

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

Geben Sie hier die Bildbeschreibung ein

Robert
quelle
19

Dies geschieht unter iOS 8+ und in Swift. Es gibt kein setTitleTextAttributesObjekt für das Erscheinungsbild. Tun Sie stattdessen Folgendes:

UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : AppTheme.fontWithSize(18)]
Matthew Quiros
quelle
5

Dazu habe ich der AppDelegate.m-Klasse nur wenige Codezeilen hinzugefügt. DidFinishLaunchingWithOptions-Methode: Verwenden Sie diesen 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];

Für mich geht das...

Maishi Wadhwani
quelle
5

Wenn Sie dies in Swift tun müssen, können Sie eine Erweiterung für die UINavigationBar erstellen, damit Sie diese Einstellungen abrufen oder festlegen können.

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

Sie können dann die Farbe und Schriftart wie folgt einstellen:

navigationBar.titleColor = UIColor.redColor()
navigationBar.titleFont = UIFont.systemFontOfSize(12)
totiG
quelle
Ich denke, diese Lösung funktioniert, wenn Sie entweder titleColoroder titleFonteinzeln verwenden. Wenn Sie sie zusammen verwenden, self.titleTextAttributeswird bei jedem Aufruf einer der Variablen ein neuer Wert festgelegt. Der Setter könnte wahrscheinlich den anderen Wert erhalten, wenn er das neue Wörterbuch erstellt.
user023
1

Dies kann verwendet werden, um eine benutzerdefinierte Ansicht auf eine einzelne Navigationsleiste anstelle einer globalen Einstellung festzulegen

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

Verwenden Sie diese Codezeile

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

Ich denke, das wird für Sie hilfreich sein.

Vishiphone
quelle
Ich weiß das, ich habe versucht, die Proxy-Funktion der Erscheinungs-API zu verwenden
carbonr