Цвет заголовка навигационной панели iPhone - PullRequest
279 голосов
/ 01 марта 2009

Кажется, что заголовок панели навигации iOS по умолчанию белый. Есть ли способ изменить его на другой цвет?

Мне известен подход navigationItem.titleView с использованием изображения. Поскольку мои дизайнерские навыки ограничены, и я не смог получить стандартный глянцевый, я предпочитаю менять цвет текста.

Любое понимание будет высоко ценится.

Ответы [ 32 ]

421 голосов
/ 07 марта 2009

Современный подход

Современный способ для всего контроллера навигации ... сделать это один раз, когда загружен корневой вид вашего контроллера навигации.

[self.navigationController.navigationBar setTitleTextAttributes:
   @{NSForegroundColorAttributeName:[UIColor yellowColor]}];

Однако, это, похоже, не влияет на последующие представления.

Классический подход

Старый способ для каждого контроллера представления (эти константы для iOS 6, но если вы хотите сделать это для каждого контроллера представления в iOS 7, вам понадобится тот же подход, но с разными константами):

Вам необходимо использовать UILabel в качестве titleView из navigationItem.

Метка должна:

  • Четкий фоновый цвет (label.backgroundColor = [UIColor clearColor]).
  • Использовать системный шрифт жирным шрифтом 20pt (label.font = [UIFont boldSystemFontOfSize: 20.0f]).
  • Имейте черную тень с 50% альфа (label.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5]).
  • Вы также захотите установить выравнивание текста по центру (label.textAlignment = NSTextAlignmentCenter (UITextAlignmentCenter для старых SDK).

Установите цвет текста ярлыка на любой другой цвет, который вы хотите. Вам нужен цвет, который не приводит к смешиванию текста с тенью, который будет трудно читать.

Я решил это методом проб и ошибок, но значения, которые я придумал, в конечном итоге слишком просты, чтобы Apple не выбрала их. :)

Если вы хотите проверить это, перетащите этот код в initWithNibName:bundle: в PageThreeViewController.m из образца Apple NavBar . Это заменит текст с желтой меткой. Это должно быть неотличимо от оригинала, созданного кодом Apple, за исключением цвета.

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self)
    {
        // this will appear as the title in the navigation bar
        UILabel *label = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
        label.backgroundColor = [UIColor clearColor];
        label.font = [UIFont boldSystemFontOfSize:20.0];
        label.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];
        label.textAlignment = NSTextAlignmentCenter;
                           // ^-Use UITextAlignmentCenter for older SDKs.
        label.textColor = [UIColor yellowColor]; // change this color
        self.navigationItem.titleView = label;
        label.text = NSLocalizedString(@"PageThreeTitle", @"");
        [label sizeToFit];
    }

    return self;
}

Редактировать: Также прочитайте ответ Эрика Б. ниже. Мой код показывает эффект, но его код предлагает более простой способ установить это на существующий контроллер представления.

226 голосов
/ 27 октября 2011

Я знаю, что это довольно старая тема, но я думаю, что было бы полезно узнать для новых пользователей, что в iOS 5 добавлено новое свойство для установки свойств заголовка.

Вы можете использовать UINavigationBar setTitleTextAttributes для установки шрифта, цвета, смещения и цвета тени.

Кроме того, вы можете установить одинаковые атрибуты текста заголовка UINavigationBar по умолчанию для всех UINavigationBars во всем приложении.

Например, вот так:

NSDictionary *navbarTitleTextAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                            [UIColor whiteColor],UITextAttributeTextColor, 
                                            [UIColor blackColor], UITextAttributeTextShadowColor, 
                                            [NSValue valueWithUIOffset:UIOffsetMake(-1, 0)], UITextAttributeTextShadowOffset, nil];

[[UINavigationBar appearance] setTitleTextAttributes:navbarTitleTextAttributes];
180 голосов
/ 26 февраля 2012

В iOS 5 вы можете изменить цвет заголовка навигационной панели следующим образом:

navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor yellowColor]};
127 голосов
/ 05 мая 2011

Основываясь на ответе Стивена Фишера, я написал этот фрагмент кода:

- (void)setTitle:(NSString *)title
{
    [super setTitle:title];
    UILabel *titleView = (UILabel *)self.navigationItem.titleView;
    if (!titleView) {
        titleView = [[UILabel alloc] initWithFrame:CGRectZero];
        titleView.backgroundColor = [UIColor clearColor];
        titleView.font = [UIFont boldSystemFontOfSize:20.0];
        titleView.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];

        titleView.textColor = [UIColor yellowColor]; // Change to desired color

        self.navigationItem.titleView = titleView;
        [titleView release];
    }
    titleView.text = title;
    [titleView sizeToFit];
}

Преимущество этого кода, помимо правильной работы с фреймом, состоит в том, что если вы измените заголовок вашего контроллера, пользовательский вид заголовка также будет обновлен. Нет необходимости обновлять его вручную.

Еще одно большое преимущество заключается в том, что он позволяет очень просто включить пользовательский цвет заголовка. Все, что вам нужно сделать, это добавить этот метод в контроллер.

40 голосов
/ 03 октября 2013

Большинство вышеперечисленных предложений устарели, для iOS 7 -

NSDictionary *textAttributes = [NSDictionary dictionaryWithObjectsAndKeys: 
                               [UIColor whiteColor],NSForegroundColorAttributeName, 
                               [UIColor whiteColor],NSBackgroundColorAttributeName,nil];

self.navigationController.navigationBar.titleTextAttributes = textAttributes;
self.title = @"Title of the Page";

Кроме того, проверьте NSAttributedString.h для различных свойств текста, которые можно установить.

38 голосов
/ 19 декабря 2013

В IOS 7 и 8 вы можете изменить цвет заголовка, скажем, зеленый

self.navigationController.navigationBar.titleTextAttributes = [NSDictionary dictionaryWithObject:[UIColor greenColor] forKey:NSForegroundColorAttributeName];
22 голосов
/ 14 августа 2015

Для актуальности вопроса я добавлю решение Алекс Р. , но в Swift :

self.navigationController.navigationBar.barTintColor = .blueColor()
self.navigationController.navigationBar.tintColor = .whiteColor()
self.navigationController.navigationBar.titleTextAttributes = [
    NSForegroundColorAttributeName : UIColor.whiteColor()
]

Что приводит к:

enter image description here

14 голосов
/ 08 апреля 2016

Метод 1 , установите его в IB:

enter image description here

Метод 2 , одна строка кода:

navigationController?.navigationBar.barTintColor = UIColor.blackColor()
13 голосов
/ 24 сентября 2010

Решение от tewha работает хорошо, если вы пытаетесь изменить цвет на странице, но я хочу иметь возможность изменять цвет на каждой странице. Я сделал несколько небольших модификаций, чтобы он работал для всех страниц на UINavigationController

NavigationDelegate.h

//This will change the color of the navigation bar
#import <Foundation/Foundation.h>
@interface NavigationDelegate : NSObject<UINavigationControllerDelegate> {
}
@end

NavigationDelegate.m

#import "NavigationDelegate.h"
@implementation NavigationDelegate

- (void)navigationController:(UINavigationController *)navigationController 
      willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
    CGRect frame = CGRectMake(0, 0, 200, 44);//TODO: Can we get the size of the text?
    UILabel* label = [[[UILabel alloc] initWithFrame:frame] autorelease];
    label.backgroundColor = [UIColor clearColor];
    label.font = [UIFont boldSystemFontOfSize:20.0];
    label.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];
    label.textAlignment = UITextAlignmentCenter;
    label.textColor = [UIColor yellowColor];
    //The two lines below are the only ones that have changed
    label.text=viewController.title;
    viewController.navigationItem.titleView = label;
}
@end
13 голосов
/ 11 сентября 2012

Начиная с iOS 5, мы должны установить цвет текста заголовка и шрифт панели навигации, используя словарь titleTextAttribute (предопределенный словарь в справочнике по классу контроллера UInavigation).

 [[UINavigationBar appearance] setTitleTextAttributes:
 [NSDictionary dictionaryWithObjectsAndKeys:
  [UIColor blackColor],UITextAttributeTextColor, 
[UIFont fontWithName:@"ArialMT" size:16.0], UITextAttributeFont,nil]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...