web-dev-qa-db-ja.com

iPhoneナビゲーションバーのタイトルのテキストの色

IOSナビゲーションバーのタイトルの色は、デフォルトでは白です。違う色に変える方法はありますか?

私は画像を使ったnavigationItem.titleViewアプローチを知っています。私のデザインスキルは限られており、私は標準的な光沢を得ることができなかったので、私はテキストの色を変えることを好みます。

任意の洞察力は大歓迎です。

279
Roby

現代の取り組み

最新の方法では、ナビゲーションコントローラ全体に対して、ナビゲーションコントローラのルートビューが読み込まれたときにこれを1回実行します。

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

ただし、これは以降のビューでは効果がないようです。

古典的なアプローチ

古い方法では、View Controllerごとに(これらの定数はiOS 6用ですが、iOS 7の外観ではView Controllerごとに行いたい場合は、同じアプローチを使用しますが、定数は異なります)。

UILabeltitleViewとして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(古いSDKの場合はUITextAlignmentCenter))。

ラベルテキストの色を好みの色に設定します。あなたは、テキストが影に溶け込まないような色を望みますが、それは読むのが難しいでしょう。

私はこれを試行錯誤して解決しましたが、思いついた値は最終的には単純すぎて、Appleが選んだものにはなりません。 :)

これを検証したい場合は、このコードを AppleのNavBarサンプルのinitWithNibName:bundle:PageThreeViewController.mにドロップしてください 。これはテキストを黄色いラベルに置き換えます。色を除いて、これは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;
}

編集:また、以下のエリックBの答えを読んでください。私のコードはその効果を示していますが、彼のコードはこれを既存のView Controllerに配置する簡単な方法を提供します。

421
Steven Fisher

私はこれがかなり古いスレッドであることを知っています、しかし私はそれがiOS 5がタイトルプロパティを確立するための新しいプロパティを持っていることを新しいユーザーにとって知っておくのが役に立つと思います。

UINavigationBarのsetTitleTextAttributesを使って、フォント、色、オフセット、影の色を設定できます。

さらに、アプリケーション全体のすべてのUINavigationBarsに対して、同じデフォルトのUINavigationBarのタイトルテキスト属性を設定できます。

例えばこんな感じ:

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

[[UINavigationBar appearance] setTitleTextAttributes:navbarTitleTextAttributes];
226
Alex R. R.

IOS 5では、次の方法でナビゲーションバーのタイトルの色を変更できます。

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

Steven Fisherの答えに基づいて、私はこのコードを書いた。

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

このコードの利点は、フレームを適切に扱うことに加えて、コントローラのタイトルを変更した場合にカスタムタイトルビューも更新されることです。手動で更新する必要はありません。

もう1つの大きな利点は、カスタムタイトルカラーを有効にするのがとても簡単になることです。あなたがする必要があるのはコントローラにこのメソッドを追加することだけです。

127
Erik B

上記の提案のほとんどは、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をチェックしてください。

40
girish_vr

IOS 7と8では、タイトルの色を変更して緑色と言えるようになります。

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

質問を最新に保つために、Alex RRソリューションを追加しますが、Swift

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

結果は次のとおりです。

enter image description here

22
Michal

方法1、IBに設定します。

enter image description here

方法2、1行のコード:

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

Tewhaによる解決策は、ページ上の色を変更しようとしている場合にはうまくいきますが、すべてのページ上で色を変更できるようにしたいのです。 UINavigationControllerallページでも動作するように、少し修正を加えました。

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
Casebash

IOS 5以降では、titleTextAttribute Dictionary(UInavigationコントローラークラスリファレンスで定義済みの辞書)を使用して、ナビゲーションバーのタイトルテキストの色とフォントを設定する必要があります。

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

Swiftバージョン

私はあなたのほとんどの人がObjective_Cバージョンの答えを提示したのを見つけました

私はそれを必要とする人のためにSwiftを使ってこの関数を実装したいと思います。

ViewDidloadの場合

1.ナビゲーションバーの背景色を色にするには(例: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.ナビゲーションバーのタイトルを変更する(例:[フォント:Futura、10] [色:赤])

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

(ヒント1:UIFontの後の "!"マークを忘れないでください)

(ヒント2:タイトルテキストにはたくさんの属性があります、コマンドをクリックして "NSFontAttributeName"を入力すると、クラスとビューのkeyNamesとそれらが必要とするオブジェクト型を入力することができます)

私は私が助けることができると思います!:D

11
Microos

下記のコードをView Controllerの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.
}
10
Gaurav Gilani

短くて甘い。

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

これはStevensに基づいた私の解決策です

実際の違いは、テキストの長さに応じて位置を調整するための処理をいくつか入れたところですが、Appleのやり方に似ているようです

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の値を調整することがあります。

8
Anthony Main

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];
    }
}
6
Ramesh

私はナビゲーションボタンが中央から外れてテキストを投げている(あなたが一つのボタンしか持っていないとき)という問題に遭遇した。それを修正するために、私はちょうど私のように私のフレームサイズを変更しました:

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

NavigationBarの背景画像と左ボタン項目をカスタマイズしましたが、灰色のタイトルは背景に合いません。それから私は使用します:

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

色合いをグレーに変更します。そしてタイトルは白になりました!それが私が欲しいものです。

また助けることを願っています:)

6
Shiny

これはかなり古いスレッドですが、iOS 7以降でナビゲーションバーのタイトルの色、サイズ、および垂直位置を設定するための回答を提供することを考えています

色とサイズの場合

 NSDictionary *titleAttributes =@{
                                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;
6
Abdullah Saeed

これは私にとってSwiftでうまくいきます:

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

タイトルのフォントサイズを設定するには、次の条件を使用しました。

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

新しいiOS 7のテキスト属性と最新のObjective Cを使用してノイズを軽減するAlex R. R.の投稿への更新。

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

オリエンテーションサポートにはこれを使用

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];
3
Nikesh K
self.navigationItem.title=@"Extras";
[self.navigationController.navigationBar setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"HelveticaNeue" size:21], NSFontAttributeName,[UIColor whiteColor],UITextAttributeTextColor,nil]];
2
Paresh Hirpara

UINavigationBarの色を設定する適切な方法は、次のとおりです。

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

上記のコードはUINavigationBarのサブクラスですが、明らかにサブクラス化しなくても動作します。

2
stringCode

これは欠けているものの一つです。最善の策は、独自のカスタムナビゲーションバーを作成し、テキストボックスを追加して、そのように色を操作することです。

2
David McGraw

Swift 4バージョン:

self.navigationController.navigationBar.titleTextAttributes = [
        NSAttributedStringKey.foregroundColor: UIColor.green]
2
Patricio Bravo

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;
2
john

あなたは[label sizeToFit]を呼ぶべきです。他のボタンがナビゲーションバーを占めているときにラベルがタイトルビュー内で自動的に再配置されるときにテキストが奇妙なオフセットを防ぐように設定した後.

1
George

このメソッドをapplelegateファイルで使用でき、あらゆるビューで使用できます

+(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;
}
1
sinh99

titleTextAttributesバーのタイトルテキストの属性を表示します。

@property(nonatomic、copy)NSDictionary * titleTextAttributes解説テキスト属性辞書でタイトルのフォント、テキストの色、テキストの影の色、およびテキストの影のオフセットを指定できます。これについては、 『NSString UIKit追加ガイド』に記載されているテキスト属性キーを使用してください。

提供時期iOS 5.0以降で利用できます。 UINavigationBar.hで宣言されています

1
dip

私はiOS 9のために以下のコードを使っていて、それは私のためにうまく働いています。私はタイトルにも影の色を使っています。

self.navigationItem.title = @"MY NAV TITLE";
self.navigationController.navigationBar.barTintColor = [UIColor redColor];
self.navigationController.navigationBar.translucent = NO;
NSShadow *shadow = [[NSShadow alloc] init];
shadow.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8];
shadow.shadowOffset = CGSizeMake(0, 1);
[self.navigationController.navigationBar setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
                                                       [UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], NSForegroundColorAttributeName,
                                                       shadow, NSShadowAttributeName,
                                                       [UIFont fontWithName:@"HelveticaNeue-Light" size:21.0], NSFontAttributeName, nil]];

これでよろしくお願いします。

ありがとう

0
Ashu

Erik Bの優れたソリューションをアプリのさまざまなUIVIewCOntrollersでより使いやすくするために、UIViewControllerのカテゴリを追加し、その中にsetTitle:titleメソッドを宣言することをお勧めします。このように、複製する必要なしに、すべてのView Controllerでタイトルの色が変わります。

注意すべき1つのことは、あなたが[super setTItle:tilte]を必要としないということです。 Erikのコードでは、このメソッドを呼び出すには、ビューコントローラでself.title = @ "my new 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];
}

@終わり

0
Abolfoooud