109

所以我有这个代码应该改变导航栏标题字体,但它确实

    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont
                                                                       fontWithName:_dataManager.optionsSettings.fontString size:14], NSFontAttributeName,
                            [UIColor whiteColor], NSForegroundColorAttributeName, nil];

[[UINavigationBar appearance] setTitleTextAttributes:attributes];

使用此代码更改后退按钮字体效果很好。

   //set backbutton font
NSDictionary *normalAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                  [UIFont fontWithName:_dataManager.optionsSettings.fontString size:15], NSFontAttributeName,
                                  nil];
[[UIBarButtonItem appearance] setTitleTextAttributes:normalAttributes
                                            forState:UIControlStateNormal];
4

18 回答 18

262

更改标题字体(和颜色)的正确方法是:

[self.navigationController.navigationBar setTitleTextAttributes:
 @{NSForegroundColorAttributeName:[UIColor redColor],
NSFontAttributeName:[UIFont fontWithName:@"mplus-1c-regular" size:21]}];

编辑:斯威夫特 4.2

self.navigationController?.navigationBar.titleTextAttributes =
[NSAttributedString.Key.foregroundColor: UIColor.red,
 NSAttributedString.Key.font: UIFont(name: "mplus-1c-regular", size: 21)!]

编辑:斯威夫特 4

self.navigationController?.navigationBar.titleTextAttributes =
[NSAttributedStringKey.foregroundColor: UIColor.red,
 NSAttributedStringKey.font: UIFont(name: "mplus-1c-regular", size: 21)!]

斯威夫特 3:

self.navigationController?.navigationBar.titleTextAttributes = 
[NSForegroundColorAttributeName: UIColor.redColor(),
 NSFontAttributeName: UIFont(name: "mplus-1c-regular", size: 21)!]

斯威夫特 5:

navigation.navigationBar.titleTextAttributes = [
    .foregroundColor: UIColor.red,
    .font: UIFont(name: "mplus-1c-regular", size: 21)!
]
于 2014-02-22T04:30:51.750 回答
54

其他答案没有任何问题。我只是分享用于设置字体的故事板版本。

1. 在导航控制器中选择导航栏

导航栏

2.更改属性检查器中的标题字体

标题字体

(在 Xcode 选择新字体之前,您可能需要切换导航栏的 Bar Tint)

注释(注意事项)

验证这确实适用于 Xcode 7.1.1+。(请参阅下面的示例

  1. 您确实需要在字体生效之前切换导航栏色调(似乎是 Xcode 中的一个错误;您可以将其切换回默认值并且字体会粘住)
  2. 如果选择系统字体~一定要确保大小不是0.0(否则新字体会被忽略)

尺寸

  1. 当视图层次结构中只有一个 NavBar 时,这似乎没有问题。似乎忽略了同一堆栈中的辅助 NavBar。(请注意,如果您显示主导航控制器的导航栏,则所有其他自定义导航栏设置都将被忽略)。

陷阱 (deux)

其中一些是重复的,这意味着它们很可能值得注意。

  1. 有时情节提要 xml 会损坏。这需要您以源代码模式查看 Storyboard 中的结构(右键单击 Storyboard 文件 > Open As ...)
  2. 在某些情况下,与用户定义的运行时属性关联的 navigationItem 标记被设置为视图标记的 xml 子项,而不是视图控制器标记。如果是这样,请将其从标签之间移除以进行正确操作。
  3. 切换 NavBar Tint 以确保使用自定义字体。
  4. 验证字体的大小参数,除非使用动态字体样式
  5. 视图层次结构将覆盖设置。似乎每个堆栈一种字体是可能的。

结果

导航斜体

样品

处理自定义字体

注意 ~ 可以从 Code With Chris 网站找到一个不错的清单,您可以查看示例下载项目。

如果您有自己的字体并想在情节提要中使用它,那么下面的SO Question会有一组不错的答案。一个答案确定了这些步骤。

  1. 获取自定义字体文件(.ttf,.ttc)
  2. 将字体文件导入您的 Xcode 项目
  3. 在app-info.plist中,添加应用程序提供的名为Fonts的键。它是一个数组类型,将你所有的字体文件名添加到数组中,注意:包括文件扩展名。
  4. 在故事板中,导航栏上的属性检查器,单击字体选择区域的右侧图标按钮。在弹出面板中,选择字体到自定义,然后选择您嵌入的字体名称的系列。

自定义字体解决方法

所以 Xcode 自然看起来它可以处理 UINavigationItem 上的自定义字体,但该功能只是没有正确更新(选择的字体被忽略)。

UINavigationItem

要解决此问题:

一种方法是修复使用情节提要并添加一行代码:首先将 UIView(UIButton、UILabel 或其他一些 UIView 子类)添加到视图控制器(不是导航项...Xcode 当前不允许这样做那)。添加控件后,您可以修改情节提要中的字体并将引用添加为视图控制器的出口。只需将该视图分配给 UINavigationItem.titleView。如有必要,您还可以在代码中设置文本名称。报告的错误 (23600285)。

@IBOutlet var customFontTitleView: UIButton!

//Sometime later...    
self.navigationItem.titleView = customFontTitleView
于 2015-11-17T16:08:48.003 回答
21

尝试这个:

NSDictionary *textAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor whiteColor],NSForegroundColorAttributeName,
                                [UIColor whiteColor],NSBackgroundColorAttributeName,nil];
self.navigationController.navigationBar.titleTextAttributes = textAttributes;
于 2013-11-05T14:54:29.207 回答
14

我用于更改导航栏标题的 Swift 代码:

let attributes = [NSFontAttributeName : UIFont(name: "Roboto-Medium", size: 16)!, NSForegroundColorAttributeName : UIColor.whiteColor()]
self.navigationController.navigationBar.titleTextAttributes = attributes

如果您也想更改背景字体,那么我的 AppDelegate 中有这个:

let attributes = [NSFontAttributeName : UIFont(name: "Roboto-Medium", size: 16)!, NSForegroundColorAttributeName : UIColor.whiteColor()]
UIBarButtonItem.appearance().setTitleTextAttributes(attributes, forState: UIControlState.Normal)
于 2015-04-10T14:07:05.860 回答
9

在您的 App Delegate 中添加此单行代码 - Did Finish Lauch。它将在整个应用程序中更改导航栏的字体、颜色。

UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white, NSAttributedString.Key.font: UIFont(name: "YOUR FONT NAME", size: 25.0)!]
于 2018-11-14T16:44:05.253 回答
5

这是您的问题的答案:

将您的代码移动到下面的方法,因为导航栏标题在视图加载后更新。我尝试在 viewDidLoad 中添加上面的代码不起作用,它在 viewDidAppear 方法中工作正常。

  -(void)viewDidAppear:(BOOL)animated{}
于 2017-10-25T05:22:04.450 回答
3

任何人都需要 Swift 3 版本。redColor()已更改为red.

self.navigationController?.navigationBar.titleTextAttributes =
        [NSForegroundColorAttributeName: UIColor.red,
         NSFontAttributeName: UIFont(name: "{your-font-name}", size: 21)!]
于 2016-09-28T17:19:30.550 回答
2

使用文字更具可读性:

self.navigationController.navigationBar.titleTextAttributes = @{
                                                              NSFontAttributeName:[UIFont fontWithName:@"mplus-1c-regular" size:21],
                                                              NSForegroundColorAttributeName: [UIColor whiteColor]
                                                              };
于 2015-07-12T15:24:58.237 回答
2

迅速:-

self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white, NSAttributedStringKey.font: UIFont(name:"Love Nature", size: 40)!]
于 2018-07-26T10:55:14.393 回答
2

我遇到了一个问题,因为当我尝试以编程方式更改我的 NavigationItem 标题时,我无法找到我的家庭字体(尝试了很多方法但无法使其正确运行),所以我在情节提要中找到了一种非常好的和简单的解决方法。

  1. 首先,您在 Navigation Item 下添加一个中间视图,并且不要忘记将 backGroundColor 设置为清除颜色以具有与 navBar 相同的颜色:

在此处输入图像描述

  1. 然后在此视图中添加一个可以编辑的标签(设置文本颜色、字体、大小...)
  2. 您将约束添加到标签(顶部 = 0、底部 = 0、尾随 = 0 和前导 = 0)以查看标签的文本并居中

最后,您应该在文档大纲中有类似的内容:

在此处输入图像描述

在你的 ViewController 中有类似的东西:

在此处输入图像描述

希望它可以提供帮助。

于 2017-05-11T15:59:18.123 回答
1

iOS 11

在此处输入图像描述

Objective-C

if (@available(iOS 11.0, *)) {
    self.navigationController.navigationItem.largeTitleDisplayMode =  UINavigationItemLargeTitleDisplayModeAlways;
    self.navigationController.navigationBar.prefersLargeTitles = true;

// Change Color
    self.navigationController.navigationBar.largeTitleTextAttributes = @{NSForegroundColorAttributeName: [UIColor whiteColor]};

} else {
    // Fallback on earlier versions
}
于 2018-04-03T08:50:52.447 回答
1

这是 Swift 4 的替代品(@Josh 已经回答):

let titleTextAttributed: [NSAttributedStringKey: Any] = [.foregroundColor: UIColor.red, .font: UIFont(name: "AvenirNext-Regular", size: 20) as Any]
navigationController?.navigationBar.titleTextAttributes = titleTextAttributed
于 2018-03-11T13:32:59.900 回答
1

让 Objective-C 设置字体和颜色

- (void)_setup {
    NSDictionary *barButtonTitleAttributes = @{
                                               NSForegroundColorAttributeName : [UIColor whiteColor],
                                               NSFontAttributeName :[UIFont fontWithName:@"Lato-Regular" size:15.0]
                                               };
    [self.navigationBar setTitleTextAttributes:barButtonTitleAttributes];

}
于 2018-09-11T05:32:12.347 回答
0

这是 Swift 4 的答案:

    let textAttributes:[String:Any]? = [NSAttributedStringKey.foregroundColor.rawValue:UIColor.blue, NSAttributedStringKey.font.rawValue:UIFont(name:"Avenir Next", size:20)!]
    navigationController?.navigationBar.titleTextAttributes = textAttributes
于 2017-07-19T00:15:44.443 回答
0

添加此扩展程序

extension UINavigationBar {
    func changeFont() {
        self.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white, NSAttributedStringKey.font: UIFont(name:"Poppins-Medium", size: 17)!]
    }
}

在 viewDidLoad() 中添加以下行

self.navigationController?.navigationBar.changeFont()
于 2019-06-20T11:14:53.660 回答
0

斯威夫特 4.2

self.navigationController?.navigationBar.titleTextAttributes =
        [NSAttributedString.Key.foregroundColor: UIColor.white,
         NSAttributedString.Key.font: UIFont(name: "LemonMilklight", size: 21)!]
于 2018-11-15T22:03:31.923 回答
0

不要忘记添加键的原始值以避免编译错误。

    let textAttributes:[NSAttributedStringKey: Any] = [NSAttributedStringKey(rawValue: NSAttributedStringKey.foregroundColor.rawValue):UIColor.blue, NSAttributedStringKey(rawValue: NSAttributedStringKey.font.rawValue):UIFont(name:"OpenSans", size: 17)!]
    navigationController?.navigationBar.titleTextAttributes = textAttributes
于 2018-04-04T04:35:59.390 回答
-1

在 swift 3.0 中工作要更改标题颜色,您需要像这样添加 titleTextAttributes

        let textAttributes = [NSForegroundColorAttributeName:UIColor.white]
        self.navigationController.navigationBar.titleTextAttributes = textAttributes

For changing navigationBar background color you can use this
        self.navigationController.navigationBar.barTintColor = UIColor.white

For changing navigationBar back title and back arrow color you can use this
       self.navigationController.navigationBar.tintColor = UIColor.white
于 2017-06-03T09:57:06.517 回答