Панель навигации iPhone Цвет текста заголовка

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

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

Любое понимание было бы очень оценено.

Ответ 1

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

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

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

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

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

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

Вам нужно использовать UILabel как titleView для navigationItem.

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

  • У вас есть четкий цвет фона (label.backgroundColor = [UIColor clearColor]).
  • Используйте смелый 20-ти системный шрифт (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;
}

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

Ответ 2

Я знаю, что это довольно старый поток, но я думаю, было бы полезно узнать для новых пользователей, что 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];

Ответ 3

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

navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor yellowColor]};

Ответ 4

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

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

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

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

Ответ 5

Большинство вышеперечисленных предложений теперь устарели, для использования 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 для различных свойств текста, которые можно установить.

Ответ 6

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

self.navigationController.navigationBar.titleTextAttributes = [NSDictionary dictionaryWithObject:[UIColor greenColor] forKey:NSForegroundColorAttributeName];

Ответ 7

Чтобы обновить этот вопрос, я добавлю решение Alex R. R., но в Swift:

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

Каковы результаты:

введите описание изображения здесь

Ответ 8

Решение 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

Ответ 9

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

 [[UINavigationBar appearance] setTitleTextAttributes:
 [NSDictionary dictionaryWithObjectsAndKeys:
  [UIColor blackColor],UITextAttributeTextColor, 
[UIFont fontWithName:@"ArialMT" size:16.0], UITextAttributeFont,nil]];

Ответ 10

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

введите описание изображения здесь

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

navigationController?.navigationBar.barTintColor = UIColor.blackColor()

Ответ 11

Используйте приведенный ниже код в любом представлении контроллера ViewDidLoad или viewWillAppear.

- (void)viewDidLoad
{
    [super viewDidLoad];

    //I am using UIColor yellowColor for an example but you can use whatever color you like   
    self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor yellowColor]};

    //change the title here to whatever you like
    self.title = @"Home";
    // Do any additional setup after loading the view.
}

Ответ 12

Swift Версия

Я обнаружил, что большинство из вас, ребята, представили ответы версии Objective_C

Я хотел бы реализовать эту функцию, используя Swift для всех, кто в ней нуждается.

В ViewDidload

1.Чтобы сделать фон NavigationBar цветным (например: BLUE)

self.navigationController?.navigationBar.barTintColor = UIColor.blueColor()

2.Чтобы сделать изображение NavigationBar будет Image (например: ABC.png)

let barMetrix = UIBarMetrics(rawValue: 0)!

self.navigationController?.navigationBar
      .setBackgroundImage(UIImage(named: "ABC"), forBarMetrics: barMetrix)

3.Чтобы изменить заголовок NavigationBar (например: [Font: Futura, 10] [Цвет: красный])

navigationController?.navigationBar.titleTextAttributes = [
            NSForegroundColorAttributeName : UIColor.redColor(),
            NSFontAttributeName : UIFont(name: "Futura", size: 10)!
        ]

(hint1: не забудьте знак "!" после UIFont)

(hint2: есть много атрибутов текста заголовка, команда click "NSFontAttributeName" вы можете ввести класс и просмотреть keyNames и требуемые типы объектов)

Надеюсь, я могу помочь!: D

Ответ 13

Короткий и сладкий.

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

Ответ 14

Это мое решение, основанное на Stevens

Только реальная разница заключается в том, что я установил некоторую обработку для настройки позиции, если она зависит от длины текста, похоже, похожа на то, как это делает яблоко

UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(([self.title length] < 10 ? UITextAlignmentCenter : UITextAlignmentLeft), 0, 480,44)];
titleLabel.backgroundColor = [UIColor clearColor];
titleLabel.font = [UIFont boldSystemFontOfSize: 20.0f];
titleLabel.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];
titleLabel.textAlignment = ([self.title length] < 10 ? UITextAlignmentCenter : UITextAlignmentLeft);
titleLabel.textColor = [UIColor redColor];
titleLabel.text = self.title;
self.navigationItem.titleView = titleLabel;
[titleLabel release];

Вы можете настроить значение 10 в зависимости от размера шрифта

Ответ 15

Я столкнулся с проблемой, когда мои навигационные кнопки выбрасывали текст из центра (когда у вас только одна кнопка). Чтобы исправить это, я просто изменил размер кадра следующим образом:

CGRect frame = CGRectMake(0, 0, [self.title sizeWithFont:[UIFont boldSystemFontOfSize:20.0]].width, 44);

Ответ 16

Я настроил фоновое изображение navigationBar и элемент левой кнопки, а серый заголовок не соответствует фону. Затем я использую:

[self.navigationBar setTintColor:[UIColor darkGrayColor]];

чтобы изменить цвет оттенков на серый. И название теперь белое! Это то, что я хочу.

Надеюсь также помочь:)

Ответ 17

Рекомендуется установить self.title, поскольку это используется при нажатии дочерних навигационных панелей или показе заголовка на вкладках.

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // create and customize title view
        self.title = NSLocalizedString(@"My Custom Title", @"");
        UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
        titleLabel.text = self.title;
        titleLabel.font = [UIFont boldSystemFontOfSize:16];
        titleLabel.backgroundColor = [UIColor clearColor];
        titleLabel.textColor = [UIColor whiteColor];
        [titleLabel sizeToFit];
        self.navigationItem.titleView = titleLabel;
        [titleLabel release];
    }
}

Ответ 18

Это довольно старый поток, но я думаю о предоставлении ответа для установки цвета, размера и вертикальной позиции заголовка панели навигации для iOS 7 и выше

Цвет и размер

 NSDictionary *titleAttributes [email protected]{
                                NSFontAttributeName :[UIFont fontWithName:@"Helvetica-Bold" size:14.0],
                                NSForegroundColorAttributeName : [UIColor whiteColor]
                                };

Для вертикальной позиции

[[UINavigationBar appearance] setTitleVerticalPositionAdjustment:-10.0 forBarMetrics:UIBarMetricsDefault];

Установить заголовок и назначить словарь атрибутов

[[self navigationItem] setTitle:@"CLUBHOUSE"];
self.navigationController.navigationBar.titleTextAttributes = titleAttributes;

Ответ 19

Это работает для меня в Swift:

navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.white]

Ответ 20

Используйте для этого поддержку Orientation

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,320,40)];
[view setBackgroundColor:[UIColor clearColor]];
[view setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight ];

UILabel *nameLabel = [[UILabel alloc] init];
[nameLabel setFrame:CGRectMake(0, 0, 320, 40)];
[nameLabel setBackgroundColor:[UIColor clearColor]];
[nameLabel setAutoresizingMask:UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin |UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin];
[nameLabel setTextColor:[UIColor whiteColor]];
[nameLabel setFont:[UIFont boldSystemFontOfSize:17]];
[nameLabel setText:titleString];
[nameLabel setTextAlignment:UITextAlignmentCenter];
[view addSubview:nameLabel];
[nameLabel release];
self.navigationItem.titleView = view;
[view release];

Ответ 21

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

if ([currentTitle length]>24) msize = 10.0f;
    else if ([currentTitle length]>16) msize = 14.0f;
    else if ([currentTitle length]>12) msize = 18.0f;

Ответ 22

Обновление для Alex R. R. с использованием новых атрибутов текста iOS 7 и современной цели c для меньшего шума:

NSShadow *titleShadow = [[NSShadow alloc] init];
titleShadow.shadowColor = [UIColor blackColor];
titleShadow.shadowOffset = CGSizeMake(-1, 0);
NSDictionary *navbarTitleTextAttributes = @{NSForegroundColorAttributeName:[UIColor whiteColor],
                                            NSShadowAttributeName:titleShadow};

[[UINavigationBar appearance] setTitleTextAttributes:navbarTitleTextAttributes];

Ответ 23

Это одна из тех вещей, которые отсутствуют. Лучше всего создать свою собственную панель навигации, добавить текстовое поле и манипулировать цветом таким образом.

Ответ 24

После столкновения с той же проблемой (как и другие) метки, которая перемещается, когда мы вставляем кнопку в navBar (в моем случае у меня есть счетчик, который я заменяю кнопкой при загрузке даты), вышеупомянутые решения не выполнялись "Я работаю для меня, так что вот что работало и постоянно хранило этикетку в одном и том же месте:

- (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
    //CGRect frame = CGRectMake(0, 0, [self.title sizeWithFont:[UIFont boldSystemFontOfSize:20.0]].width, 44);
   CGRect frame = CGRectMake(0, 0, 180, 44);
    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];
    self.navigationItem.titleView = label;
    label.text = NSLocalizedString(@"Latest Questions", @"");
    [label sizeToFit];
}

return self;

Ответ 25

Я считаю, что правильный способ установить цвет UINavigationBar:

NSDictionary *attributes=[NSDictionary dictionaryWithObjectsAndKeys:[UIColor redColor],UITextAttributeTextColor, nil];
self.titleTextAttributes = attributes;

Код, указанный выше, является подклассом UINavigationBar, очевидно, работает и без подкласса.

Ответ 26

Вы должны вызвать [label sizeToFit]; после установки текста для предотвращения странных смещений, когда ярлык автоматически перепозиционируется в виде заголовка, когда другие кнопки занимают навигационную панель.

Ответ 27

Можно использовать этот метод в файле appdelegate и использовать в каждом представлении

+(UILabel *) navigationTitleLable:(NSString *)title
{
CGRect frame = CGRectMake(0, 0, 165, 44);
UILabel *label = [[[UILabel alloc] initWithFrame:frame] autorelease];
label.backgroundColor = [UIColor clearColor];
label.font = NAVIGATION_TITLE_LABLE_SIZE;
label.shadowColor = [UIColor whiteColor];
label.numberOfLines = 2;
label.lineBreakMode = UILineBreakModeTailTruncation;    
label.textAlignment = UITextAlignmentCenter;
[label setShadowOffset:CGSizeMake(0,1)]; 
label.textColor = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0];

//label.text = NSLocalizedString(title, @"");

return label;
}

Ответ 28

titleTextAttributes Отображать атрибуты для заголовка заголовка.

@property (nonatomic, copy) NSDictionary * titleTextAttributes обсуждение Вы можете указать шрифт, цвет текста, цвет теневого текста и смещение тени текста для заголовка в словаре текстовых атрибутов, используя клавиши текстовых атрибутов, описанные в NSString UIKit дополнениях.

Наличие Доступно в iOS 5.0 и более поздних версиях. Объявлено в UINavigationBar.h

Ответ 29

[email protected]"Extras";
[self.navigationController.navigationBar setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"HelveticaNeue" size:21], NSFontAttributeName,[UIColor whiteColor],UITextAttributeTextColor,nil]];

Ответ 30

Чтобы сделать отличное решение Erik B более удобным для разных UIVIewCOntrollers вашего приложения, я рекомендую добавить категорию для UIViewController и объявить свой метод setTitle: title внутри. Как и вы, вы получите изменение цвета названия на всех контроллерах представления без необходимости дублирования.

Следует отметить, что вам не нужно [super setTItle: tilte]; в коде Erik, и вам нужно будет явно вызвать self.title= @ "мое новое название" в ваших контроллерах вида для этого метода, который будет называться

@implementation UIViewController (CustomeTitleColor)

- (void)setTitle:(NSString *)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 blueColor]; // Change to desired color

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

@end