更改后退导航栏按钮的字体

Posted

技术标签:

【中文标题】更改后退导航栏按钮的字体【英文标题】:Change font of back navigation bar button 【发布时间】:2013-05-08 06:44:54 【问题描述】:

我希望能够设置我的应用导航栏后退按钮的字体,而不会做任何太疯狂的事情,也不会丢失按钮的任何其他设计特征(即我想保留箭头)。

现在我在viewDidAppear: 中使用它来设置普通栏按钮项的字体。

for (NSObject *view in self.navigationController.navigationBar.subviews) 
    if ([view isKindOfClass:[UIButton class]]) 
        [((UIButton*)view).titleLabel setFont:[UIFont 
                                 fontWithName:@"Gill Sans" 
                                         size:14.0]];
    

但是,无论此代码应用于哪个UIViewController(根、当前等),这都不会改变后退按钮。

【问题讨论】:

UIBarButton 项目的自定义样式:***.com/a/28347428/469614 【参考方案1】:

要更改所有UIBarButtonItems 中出现在所有UINavigationBars 中的文本的外观,请在application:didFinishLaunchingWithOptions: 中执行以下操作

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:
    @UITextAttributeTextColor:[UIColor blackColor],
     UITextAttributeTextShadowOffset:[NSValue valueWithUIOffset:UIOffsetMake(0, 1)],
     UITextAttributeTextShadowColor:[UIColor whiteColor],
     UITextAttributeFont:[UIFont boldSystemFontOfSize:12.0]
    
     forState:UIControlStateNormal];

更新:ios7 友好版本

NSShadow *shadow = [[NSShadow alloc] init];
shadow.shadowOffset = CGSizeMake(0.0, 1.0);
shadow.shadowColor = [UIColor whiteColor];

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]
 setTitleTextAttributes:
 @NSForegroundColorAttributeName:[UIColor blackColor],
   NSShadowAttributeName:shadow,
   NSFontAttributeName:[UIFont boldSystemFontOfSize:12.0]
   
 forState:UIControlStateNormal];

斯威夫特:

注意:这会更改 UIBarButtonItem 的所有实例,而不仅仅是 UINavigationBar 中包含的实例

UIBarButtonItem.appearance()
               .setTitleTextAttributes([NSFontAttributeName : ExamplesDefaults.fontWithSize(22)], 
                                       forState: UIControlState.Normal)

Swift3:

UIBarButtonItem.appearance()
     .setTitleTextAttributes([NSFontAttributeName: UIFont(name: "FontName-Regular", size: 14.0)!], 
                             for: .normal) 

【讨论】:

这绝对是一种更简单的方法,它适用于所有未来的栏按钮项目,而不仅仅是后退按钮。 效果很好。注意 iOS 7 中不推荐使用 UITextAttributeTextColor 等。 谢谢!它为我工作。 iOS 11 怎么样?【参考方案2】:

对于没有完全让它工作的人,我是这样做的,包括在 IOS7 中弹回根 ViewController:

UIBarButtonItem *backBtn =[[UIBarButtonItem alloc]initWithTitle:@"Back" style:UIBarButtonItemStyleDone target:self action:@selector(popToRoot:)];
backBtn.title = @"Back";
[backBtn setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
                                 [UIFont fontWithName:@"Chalkduster" size:15], NSFontAttributeName,
                                 [UIColor yellowColor], NSForegroundColorAttributeName,
                                 nil]
                       forState:UIControlStateNormal];

self.navigationItem.leftBarButtonItem=backBtn;

popToRoot 视图控制器:

- (IBAction)popToRoot:(UIBarButtonItem*)sender 
[self.navigationController popToRootViewControllerAnimated:YES];

也许有人会用这个。

【讨论】:

不适用于语言环境,并丢弃将应用程序放入 IAS 所需的预配置辅助功能提示。除非您想做很多额外的工作,否则您应该始终使用系统提供的按钮。【参考方案3】:

上述所有的Swift版本(摘自original answer):

let customFont = UIFont(name: "customFontName", size: 17.0)!
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: customFont], forState: .normal)

更多好东西:https://***.com/a/28347428/469614

【讨论】:

【参考方案4】:

在 Swift3 中:

let font = UIFont(name: "Verdana", size: 10.0)

// Back button
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: font!], for: UIControlState.normal)  

// Title in the navigation item
let fontAttributes = [NSFontAttributeName: font]
self.navigationController?.navigationBar.titleTextAttributes = fontAttributes

注意:您只需为导航控制器执行一次。

【讨论】:

【参考方案5】:

Swift 3.0+

AppDelegate.swift

UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.font: UIFont(name: "myFont", size: 17.0)!], for: .normal)

【讨论】:

【参考方案6】:

在您的 AppDelegate 或 NavigationController 初始化的地方使用此方法,iOS 5 及更高版本中可用的方法

UIBarButtonItem *backbutton =  [[UIBarButtonItem alloc] initWithTitle:@"back" style:UIBarButtonItemStyleBordered target:nil action:nil];  
[backbutton setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
                                                   [UIColor blackColor],UITextAttributeTextColor,[UIFont fontWithName:TEXTFONT size:16.0f],UITextAttributeFont,
                                                   nil] forState:UIControlStateNormal]; 

【讨论】:

这并不是一个完整的答案,因为没有使用配置的 backButton。 @MikePollard 问题说要更改字体而不是如何使用按钮。如果你想知道如何使用它,你应该问。【参考方案7】:

如果您在 iOS 8 中使用新的UISplitViewControllerDelegate 进行拆分视图,上述方法将不起作用,因为新的displayModeButtonItem 的工作方式略有不同。

您需要在创建displayModeButtonItem 时设置字体。假设您正在关注 Apple 的模板,这可能在 prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 中,您可以在其中执行以下操作:

// From Apple's Template:
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
NSManagedObject *object = [[self fetchedResultsController] objectAtIndexPath:indexPath];
DetailViewController *controller = (DetailViewController *)[[segue destinationViewController] topViewController];
[controller setDetailItem:object];
controller.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem;
controller.navigationItem.leftItemsSupplementBackButton = YES;
// New Line to set the font:
[controller.navigationItem.leftBarButtonItem setTitleTextAttributes:@NSFontAttributeName : [UIFont fontWithName:@"SourceSansPro-Regular" size:14] forState:UIControlStateNormal];

【讨论】:

其实经过更多的测试,我认为这行不通。如果有人知道如何更改displayModeButtonItem 上的字体,请告诉我。【参考方案8】:

如果您需要更改标题,您将使用这个:

 UINavigationBar.appearance().titleTextAttributes = [
        NSAttributedString.Key.font: UIFont.systemFont(ofSize: 20, weight: UIFont.Weight.heavy)
    ]

但如果您的BarButtonItems 需要它,您可以使用以下内容:

UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 17.0)], for: .normal)

注意:这些行将被添加到AppDelegate.Swift 文件中

【讨论】:

以上是关于更改后退导航栏按钮的字体的主要内容,如果未能解决你的问题,请参考以下文章

更改导航栏后退按钮的粗细

导航栏后退按钮箭头字体 Swift

UIPageViewController 更改导航栏后退按钮标题

在swift 4下更改导航控制器后退按钮的字体

无法更改导航栏后退按钮的背景图像[重复]

后退按钮不会在导航栏中更改颜色