Change font of back navigation bar button

前端 未结 7 1103
走了就别回头了
走了就别回头了 2020-12-04 17:38

I want to be able to set the font of my apps navigation bar back button without doing anything too crazy and without losing any other design characteristics of the button (i

相关标签:
7条回答
  • 2020-12-04 18:07

    To change the appearance of the text in all UIBarButtonItems appearing in all UINavigationBars, do the following in 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];
    

    UPDATE: iOS7 friendly version

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

    Swift:

    NOTE: this changes ALL instances of UIBarButtonItem, not just those contained within a 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) 
    
    0 讨论(0)
  • 2020-12-04 18:08

    In 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
    

    Note: you only have to do this once for the Navigation controller.

    0 讨论(0)
  • 2020-12-04 18:15

    Swift 3.0+

    AppDelegate.swift

    UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.font: UIFont(name: "myFont", size: 17.0)!], for: .normal)
    
    0 讨论(0)
  • 2020-12-04 18:18

    For anyone that did not fully got this to work, here is how i did it, including popped back to the Root ViewController in IOS7:

    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 ViewController:

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

    Maybe someone may have use of this.

    0 讨论(0)
  • 2020-12-04 18:19

    Swift version of the all mentioned above (excerpt from the original answer) :

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

    More goodies:
    https://stackoverflow.com/a/28347428/469614

    0 讨论(0)
  • 2020-12-04 18:22

    If you're using the new UISplitViewControllerDelegate for split views in iOS 8, the above methods won't work because the new displayModeButtonItem works a bit differently.

    You need to set the font when you're creating the displayModeButtonItem. Assuming you're following Apple's templates this is probably in prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender where you would do something like this:

    // 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];
    
    0 讨论(0)
提交回复
热议问题