Jak ustawić czcionkę i kolor tytułu w UINavigationBar za pomocą interfejsu API wyglądu iOS5?

90

Mam wiele kontrolerów widoku i chcę ustawić kolor wszystkich czcionek na czerwony.

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

zgłasza nierozpoznany błąd selektora.

Jak mogę to naprawić?

carbonr
źródło
Następnie należy ustawić etykietę i wyświetlić na pasku nawigacyjnym oraz ustawić kolor czcionki
vishiphone

Odpowiedzi:

207

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

Lub jeśli wolisz styl literału obiektowego:

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

Edytuj na iOS 7 i nowsze

UITextAttributes są przestarzałe, ponieważ iOS 7 można użyć następujących elementów:

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
źródło
1
Przez ponad godzinę zmagałem się z tą częścią kodu z samouczka, która prowadzi do przycięcia tytułu mojej nawigacji po pierwszym naciśnięciu ... Uważaj na rozmiar czcionki, który był problemem w mojej sytuacji ... Najwyraźniej rozmiar 0.0 nie działało dla mnie ...
Bartu
3
nowy dosłowny słownik sprawi, że będzie o wiele ładniejszy
tybro0103
Na marginesie, jest to tylko 5.0+, jeśli wspierasz 4, warto to zrobić if ([navBarInstance respondsToSelector:@selector(appearance)])najpierw, ponieważ spowoduje to awarię wersji iOS poniżej 5.
Adam Waite
1
Nazwa czcionki jest nieprawidłowa i powoduje awarię aplikacji. Spróbuj czegoś takiego jak Arial-BoldMT.
MacMark
17
TIL UITextAttributeTextColorzostał wycofany na korzyść NSForegroundColorAttributeNameiOS 7
Brenden
23

W przypadku celów wdrożenia większych lub równych iOS 6 należy NSShadowzamiast tego użyć :

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

wprowadź opis obrazu tutaj

Robert
źródło
19

Robi to na iOS 8+ oraz w Swift. Nie ma znaku setTitleTextAttributesdla obiektu wyglądu. Zamiast tego zrób to:

UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : AppTheme.fontWithSize(18)]
MLQ
źródło
5

Zrobiłem to, dodając zaledwie kilka wierszy kodu w klasie AppDelegate.m didFinishLaunchingWithOptions metoda: Użyj tego kodu:

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

mi to pasuje...

Maishi Wadhwani
źródło
5

Jeśli musisz to zrobić w Swift, możesz utworzyć rozszerzenie dla UINavigationBar, aby umożliwić pobieranie lub konfigurowanie tych ustawień.

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

Następnie możesz ustawić kolor i czcionkę w następujący sposób:

navigationBar.titleColor = UIColor.redColor()
navigationBar.titleFont = UIFont.systemFontOfSize(12)
totiG
źródło
Myślę, że to rozwiązanie działa, jeśli używasz jednego titleColorlub titleFontindywidualnie. Jeśli użyjesz ich razem, przy self.titleTextAttributeskażdym wywołaniu jednej ze zmiennych zostanie ustawiona nowa wartość. Setter prawdopodobnie mógłby uzyskać inną wartość podczas tworzenia nowego słownika.
user023
1

Można to wykorzystać do ustawienia widoku niestandardowego na pojedynczy pasek nawigacji zamiast ustawienia globalnego

- (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
źródło
-5

Użyj tej linii kodu

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

Myślę, że to ci pomoże.

vishiphone
źródło
Wiem o tym, próbowałem użyć funkcji proxy interfejsu API wyglądu
carbonr